【问题标题】:How to store values in a PHP array as multiple records in MySQL如何将 PHP 数组中的值存储为 MySQL 中的多条记录
【发布时间】:2019-01-10 18:48:42
【问题描述】:

我创建了一个 PHP 函数来将数据插入 MySQL 表。传递给函数的值之一是数组。该数组仅包含唯一值。当我运行脚本时,它会将一条记录保存到表中,其中对应于存储所有数组值的数组的字段。

这是我在单独的类文件中的函数:

public function importTest($val1,$valArray,$val3){

    try {

        $stm = $this->dbSt->prepare('INSERT INTO table (val1,valArray,val3) VALUES (:val1,:valArray,:val3)');

        $stm->bindParam(':val1',$val1);
        $stm->bindParam(':valArray',$valArray);
        $stm->bindParam(':val3',$val3);

        if($stm->execute()){

            return true;
        }

    }catch (PDOException $e) {

        echo $e->getMessage();
    }


    return false;

}

设置$test 并回显到屏幕以进行测试。这将显示我正在寻找的数组中的所有唯一值。:

$test = implode("<br />", (array_keys($array_unique_guests)));

echo 'TEST:<br /> '.$test.' <br />';  // Displays all unique values
echo '<br /><br />';

这是我调用函数的地方:

$importTest = $statsDao->importTest($getSites[$x]['site_id'],$test,$updateDate);

我正在使用 for 循环来获取调用另一个函数的 $getSites 的值。

我需要将所有值作为 $test 回显到上面的屏幕,以将其保存为表中的新记录。相反,它们都被添加到一个记录中。

我想插入与数组中的值一样多的行。这个数字会改变,但是例如,如果数组中有 10 个值,则应该有 10 条记录添加到表中,以及一个日期和另一个字段。基本上,我试图检索数组中的所有值,并在脚本运行时为每个值创建一条新记录。

我希望这很清楚。我已经坚持了一段时间,希望有人能提供帮助!

谢谢!

【问题讨论】:

  • 要开始传递$test,它是一个字符串,因此请确保传递要存储的值数组。
  • 所以基本上你试图生成类似INSERT INTO ... VALUES(&lt;value&gt;),(&lt;value&gt;)[, ...] 的东西,它可以在 MYSQL 中插入多条记录..
  • 如果我理解的话,你想遍历数组,数组中的每个元素 - 使用该值向数据库添加一行?
  • 是的,这是正确的 Jaquarh - 在表格中添加一行,其中包含数组中的每个元素。我不确定如何传入数组而不是字符串。

标签: php arrays function


【解决方案1】:

将数组传递给函数,而不是内爆字符串,然后在函数中使用循环。

public function importTest($val1,$valArray,$val3){

    try {

        $stm = $this->dbSt->prepare('INSERT INTO table (val1,valArray,val3) VALUES (:val1,:val2,:val3)');

        $stm->bindParam(':val1',$val1);
        $stm->bindParam(':val2',$val2);
        $stm->bindParam(':val3',$val3);

        foreach ($valArray as $val2) {
            $stm->execute();
        }
    }catch (PDOException $e) {
        echo $e->getMessage();
        return false;
    }
    return true;
}

你直接传递数组:

$statsDao->importTest($getSites[$x]['site_id'], array_keys($array_unique_guests), $updateDate);

【讨论】:

  • $stm-&gt;bindParam(':val2',$val2); 将导致通知。 .$val2 在哪里定义?
  • 它在for 循环中。 bindParam 绑定了一个引用,所以你可以稍后分配它。
  • 任何有效循环都可以,我将其编辑为更通用
  • “它在 for 循环中。bindParam 绑定了一个引用,所以你可以稍后分配它”确实public bool PDOStatement::bindParam ( mixed $parameter , mixed &amp;$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] ) 现在我看到&amp;$variable 之前没有注意到它确实是一个引用跨度>
  • 这就是bindParambindVal的区别。
【解决方案2】:

到目前为止,我可以从标题中猜到,

 $inser = "INSERT INTO table_name(id,name,pass) VALUES";
    $valuearray = array( // the array composed of values that you have prepared
          [  
            "id"  => 1,
            "name" => "John Due",
            "pass" => "123456"
          ],
          [  
            "id"  => 2,
            "name" => "Jonathan",
            "pass" => "123456"
          ],
          [  
            "id"   => 3,
            "name" => "Jonny",
            "pass" => "123456"
          ]
    ); 
    foreach($valuearray as $val)
    {
      $inser .= "('".$val['id']."','".$val['name']."','".$val['pass']."')";
    }
    echo $inser;

【讨论】:

  • 原始代码使用prepared statement,可以防止SQL注入。为什么要降级为变量串联?另外,$valArray 只是第二列,其他两列来自$val1$val2,它们在每一行都相同。
猜你喜欢
  • 2017-07-02
  • 2011-04-05
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
相关资源
最近更新 更多