【问题标题】:PHP String from For Loop in MYSQL Insert Query not WorkingMYSQL 插入查询中 For 循环中的 PHP 字符串不起作用
【发布时间】:2013-12-29 11:57:23
【问题描述】:

我有一个如下脚本。 $_POST 中的一些值要插入到数据库中。 但它不起作用。 需要你的帮助。

<?  
$field          = array(Priority_Rank, Attending_Period, Priority_Point_Low, Priority_Point_High, Other_Consideration);

$fields         = implode(',', $field);

$fieldpost      = array();
for ($i=0; $i<count($field); $i++)  {   
     $fieldpost[]   = $_POST[$i];   }

$fieldposts     = implode (',', $fieldpost);        

$query1        =    "INSERT INTO $maindb    ($mainID,   $fields) VALUES ('$seq',$fieldposts)";      

mysql_query($query1);   ?>

我发现问题出在 VALUES(...,$fieldposts) 中,因为如果我将查询更改为以下内容,则它可以正常工作。

$query1 =   "INSERT INTO $maindb    ($mainID,   $fields) VALUES ('$seq','$_POST[0]','$_POST[1]','$_POST[2]','$_POST[3]','$_POST[4]')";

但是由于这个查询也将被其他具有不同数量 $_POST 的脚本使用,我真的需要在这个文件中循环它们。

注意:$field 位于另一个文件中。

【问题讨论】:

  • 请进入 21 世纪并学习使用带有参数化查询的 MySQLi 或 PDO...然后您就可以忘记转义字符串(无论如何您都没有这样做)并且您不需要将字符串值括在引号中(当您将值注入 MySQL 查询时会这样做,但您没有这样做,这可能是您的错误的原因)
  • 不要使用短的开放标签&lt;? 否则你是在自找麻烦
  • 您应该将值括在引号中并屏蔽它们。
  • @MarkBaker 参数化查询很难处理可变数量的字段。
  • @Barmar - 但是如果你看的话,仍然有很多例子展示了如何在互联网(或here on SO)上做到这一点,它们会消除这段代码中的很多问题

标签: php mysql for-loop


【解决方案1】:

你需要做的:

for ($i=0; $i<count($field); $i++)  {   
     $fieldpost[]   = "'" . mysql_real_escape_string($_POST[$i]) . "'";
}

以便将值括在引号中并正确转义。

【讨论】:

    【解决方案2】:

    假设您有一个包含要插入的行的数组:

    <?php
    $lines = array(
        array("Value 1A", "Value 2A", "Value 3A", "..."),
        array("Value 1B", "Value 2B", "Value 3B", "..."),
        array("Value 1C", "Value 2C", "Value 3C", "...")
        // ...
    );
    

    首先,you need to escape your values 在将它们插入查询之前,尤其是如果它们来自用户($_POST 等)。 mysql_real_escape_string() 为你做这件事。

    <?php
    foreach ($lines as &$line) {
        foreach ($line as &$value) {
            $value = '\'' . mysql_real_escape_string($value) . '\'';
        }
    }
    

    然后你建立你的个人价值集:

    <?php
    $sets = array();
    foreach ($lines as $line) {
        $sets[] = '(' . implode(', ', $line) . ')';
    }
    

    只有这样你才能构建查询

    <?php
    $query = 'INSERT INTO yourtable (field1, field2, field3) VALUES '
    $query .= implode(', ', $sets)
    
    mysql_query($query)
    

    你当然可以结合前两个循环,我只是为了解释而分开:

    <?php
    $sets = array();
    foreach ($lines as $line) {
        foreach ($line as &$value) {
            $value = '\'' . mysql_real_escape_string($value) . '\'';
        }
    
        $sets[] = '(' . implode(', ', $line) . ')';
    }
    
    $query = 'INSERT INTO yourtable (field1, field2, field3) VALUES '
    $query .= implode(', ', $sets)
    
    mysql_query($query)
    

    【讨论】:

      【解决方案3】:

      尝试以下操作以确保发布的字段名称有效并且值正确转义。

      $fields = array('column_a', 'column_b', 'column_c');
      
      foreach($_POST as $name => $value) {
        if (isset($fields[$name])) {
          $columns[] = $fields[$name];
          $values[]  = "'" . mysql_real_escape_string($value) ."'";
        }
      }
      if (! empty($columns)) {
        $sql = sprintf('INSERT INTO %s (%s) (%S)', $tableName, implode(',', $columns), implode(',', $values));
      }
      

      确实,您应该为值使用参数占位符 (?),并使用 PDO 或等效项准备语句。

      【讨论】:

        猜你喜欢
        • 2012-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-22
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多