0

我正在尝试从多个表单字段(文本字段和文本区域)更新 mysql 表的一行(= ID)。该表如下所示:

身份证 | 第 1 栏 | 第 2 栏 | 第 3 列 ... | 第 50 列

一切正常,如果我使用这样的 $_Post[] 变量

$Name = $_POST['Name'];
$Name2 = $_POST['Name2'];  
$sql= "UPDATE Bilder SET Name = '$Name', Name2 = '$Name2' WHERE id = '$ID'"; 


<form id="InsertData" action="insert-dataset.php" method="post"> 
  <input type="hidden" name="ID" id="ID" value="'.$row->id.'" /> 
  <input type="text" name="Name" value="'.$row->Name.'" /><br />
  <input type="text" name="Name2" value="'.$row->Name.'" /><br />  
  <input type="submit" name="submit" value="Daten eintragen" class="sendbutton" /> 
</form> 

由于我有数百个字段,我宁愿使用这样的数组:

<input type="text" name="Name[]" value="'.$row->Name.'" />

我找到了更新一列所有单元格的工作示例。但我必须更新一个 ID 的所有列。

任何帮助,将不胜感激。提前致谢!

这是最终结果:

$col_result = mysql_query("SHOW COLUMNS FROM Bilder");
$row_result = mysql_query(sprintf("SELECT * FROM Bilder WHERE id = %s", $ID));
if(!$col_result) {
    echo 'Konnte Anfrage nicht ausführen: ' . mysql_error();
    exit;
}
if ( !empty($_POST) ) { 
    $aDataSet = array(); 
    while( list( $field, $value ) = each( $_POST )) { 
    $aDataSet[] = $field . "='" . $value . "'";
    } 
$update_sql = "UPDATE Bilder SET " . implode( ',', $aDataSet ); 
$update_sql .= sprintf("WHERE id = '$ID'");
$result = mysql_query($update_sql, $connection); 
if(!$result)  
 {  
 die('');  
 }  
 echo '';  
}   
mysql_close($connection)
?> 

更新查询将仅包括具有相应输入字段的列(输入名称 = 列名称)。由于我有数百个输入字段,因此我可以使用更新查询的相同代码将它们分布在多个页面上。

谢谢大家的帮助。

4

3 回答 3

0

这里有几个想法。

注:未经测试

<?php
// Get all of the field names
$col_result = mysql_query("SHOW COLUMNS FROM Bilder");

// make sure we could get the colnames from mysql
if(!$col_result) {
    echo 'Could not run query: ' . mysql_error();
    exit;
}

// Handle a POST
if(!empty($_POST)){
    // start preparing the update statement
    $update_sql = "UPDATE Bilder SET ";
    if(mysql_num_rows($col_result) > 0) {
        // make a key = value statement for each column in the table
        while($colrow = mysql_fetch_assoc($col_result)) {
            // prepare the key = value statement
            $update_sql .= sprintf(" %s = %s, ", $colrow["Field"], mysql_real_escape_string($_POST[$colrow["Field"]]));
        }
    }
    // BTW this is going to have a extra "," in it use substr to clear it
    $update_sql = substr_replace($update_sql ,"", -2);

    // finish off by limiting this statement to only one row
    $update_sql .= sprintf(" WHERE id = %s", mysql_real_escape_string($_POST["id"]));

    // ACTUALLY RUN THIS STATEMENT
}

if(!$row_result) {
    echo 'Could not run query: ' . mysql_error();
    exit;
}

    // 准备 sql 以获取我们正在处理的当前行 $row_result = mysql_query(sprintf("SELECT * FROM Bilder WHERE id = %s", $id));

// Get the row item that you are currently working on
$row = mysql_fetch_row($row_result);

// output all the formfields for the above row
if(mysql_num_rows($col_result) > 0) {
    // Go through all of the columns and output the colname from $colrow and the value from $row
    while ($colrow = mysql_fetch_assoc($col_result)) {
        // The HTML (don't be daunted by that variable-variable http://php.net/manual/en/language.variables.variable.php)
        echo '<input type="text" name="' . $colrow["Field"] . '" value="' . $row->{$colrow["Field"]} . '" /><br />';
    }
}
?>
  • 最后,EAV 风格的 DB 可能会为您提供更好的服务,其中一行的字段数是可变的。(一个 php 和 mysql 的公平示例:http ://www.iwilldomybest.com/2008/08/php-mysql-tip-3/ )
于 2013-09-10T14:54:32.197 回答
0

好的,我使用了 preg_replace。这可能不是最佳实践。代码看起来像这样并且工作得很好:

// Handle a POST
if(!empty($_POST)){
    // start preparing the update statement
    $update_sql = "UPDATE Bilder SET ";
    if(mysql_num_rows($col_result) > 0) {
        // make a key = value statement for each column in the table
        while($colrow = mysql_fetch_assoc($col_result)) {
            // prepare the key = value statement
        $update_sql .= sprintf("%s = '%s',", $colrow["Field"], mysql_real_escape_string($_POST[$colrow["Field"]]));
        }

    }
// BTW this is going to have a extra "," in it use substr to clear it

// finish off by limiting this statement to only one row
$update_sql .= sprintf("WHERE id = '$ID'");
$update_sql = preg_replace("/,WHERE/", "WHERE", $update_sql);

当然,还有安全问题。我会解决的。但是,这并不重要,因为此应用程序仅供个人使用。它不可公开访问。

于 2013-09-11T20:06:51.367 回答
0

大概是这样的:

$str = '';
$id = 0;
foreach($_POST['Name'] as $value)
{
    $id ++;
    $str .= ($str == '' ? '' : ', ').'Name'.$id.' = \''.addslashes($value).'\'';
}
$sql= "UPDATE Bilder SET ".$str." WHERE id = '$ID'";

注意:在本例中,您的 sql 字段为 Name1、Name2、Name3...

注意 2:在 sql 查询中粘贴变量时,您至少应该始终使用 addlashes 方法,以保护自己免受黑客攻击。

于 2013-09-10T14:28:57.213 回答