【问题标题】:Store an array in multiple rows in MySQL在 MySQL 中将数组存储在多行中
【发布时间】:2020-12-14 12:31:46
【问题描述】:

我只是想使用 MySQL 数据库将数组存储在多行中。不幸的是,它只保存最后一个值。

<?php    
session_start();
require_once "../phpquery/dbconnection.php";
    
$testings       = $_POST["testings"];
$presid         = $_POST["presid"];
$lab_status     = "0";
$patient_status = "1";
$update_status  = "0";
    
foreach( $testings as $testing) {
    
    if($stmt = mysqli_prepare($con,"INSERT INTO testing_schedule 
                                (p_id,pres_id,testing_perform,submit_date,
                                    lab_status,patient_status,update_status) 
                            VALUES ( ?,?, ?, ?, ?,?,?)")){
    
        $cur_date = date('Y-m-d');
        mysqli_stmt_bind_param($stmt, "sssssss",
                                    $_SESSION['p_id'],
                                    $presid , 
                                    $testing,
                                    $cur_date,
                                    $lab_status,
                                    $patient_status,
                                    $update_status);
    
        echo "Successfully saved";
    } else{
        echo "ERROR: Could not prepare query: $con. " . mysqli_error($con);
    }
}
?>

使用 printr() 的图片:

【问题讨论】:

  • 打印$testings 看看它是否真的是一个数组
  • 当然。这是一个array
  • 虽然没有以最佳方式编码,但如果$testings 是一个多次出现的数组,则该代码应该创建多行。所以请检查/证明$testings 实际上是一个不止一次出现的数组
  • 在 foreach 循环中包含这一行 echo "Successfully saved"; 是一种误导
  • 确定,我已经查过了

标签: php arrays mysqli


【解决方案1】:

你应该这样做:

• 首先,prepare 语句一次, 使用 ? 占位符,就像您现在所做的那样。分别准备您需要的每条语句。

• 现在,在开始循环之前,BEGIN TRANSACTION

• 接下来,遍历循环,每次都使用正确的占位符值执行准备好的语句。

• 最后,COMMIT

• 现在,使用try{} 块来catch 循环期间可能发生的任何错误。如果发生这种情况,ROLLBACK 事务而不是提交它。


“SQL 事务”,如此处所示,使整个更新原子。没有人会看到更改您正在制作它们。相反,当您提交时,他们会看到整个更改“一次性”发生。然而,如果事务被回滚,“什么都没有发生”。 (另外,在大多数系统中,事务使这些操作相当更有效率......)

【讨论】:

猜你喜欢
  • 2014-05-16
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 2014-06-02
  • 2013-12-16
  • 2016-04-03
  • 1970-01-01
  • 2011-06-09
相关资源
最近更新 更多