通过$ stmt-> bind_param

时间:2018-08-21 11:08:03

标签: php mysql

我想在我的数据库中插入数组中的多行。

目前,即使我的代码遍历数组,它也只插入一行。

这是我的代码:

$counter = count($the_order);
for($i = 0;$i<$counter;$i++){
    list($quantity, $name_prod, $vial_type, $price) = $the_order[$i];
    $priceitem = $price/$quantity;

    $sql_query = "INSERT INTO tbl_order_items(Prod_name, Vial_type, Prod_price, Prod_qty, Prod_total) 
                VALUES (?, ?, ?, ?, ?)";

    $stmt = $connect->stmt_init();
    if($stmt->prepare($sql_query)) {    
        // Bind your variables to replace the ?s
        $stmt->bind_param('sssss', 
                $name_prod,
                $vial_type, 
                $priceitem, 
                $quantity,  
                $price
                );
        // Execute query
        $stmt->execute();
        $result = $stmt->affected_rows;
        // store result 
        //$result = $stmt->store_result();
        $stmt->close();
    }
}

更新后的代码(print_r):

Array ( 
  [0] => Array ([0] => 5 [1] => Gascure Sirop [2] => [3] => 72.5 RON ) 
  [1] => Array ( [0] => 5 [1] => Graviola Star [2] => 100 Tablete [3] =>      277.5 RON ) 
  [2] => Array ( [0] => 1 [1] => Graviola Star [2] => 100 Tablete [3] => 0.0 RON ) ) 

1 个答案:

答案 0 :(得分:1)

首先,您应该记住,使用准备好的语句的主要好处之一是您可以准备一次语句并执行多次。每次更改参数的值。由于数据库只需编译和优化一次查询,因此可以加快处理速度。因此将准备工作移出循环

第二,如果您想一次性进行许多数据库更改,那么将这些事务包装在一起的事务就是一个rate跷的主意,因此,如果中间出现问题,则可以全部获得INSERT / UPDATE或全部都不会获得,因此不要让数据库处于废话状态。

最后,进行测试时是个好主意,特别是如果您正在使用实时服务器进行开发时,可能会阻止错误来设置错误报告,因此您会在浏览器中看到任何错误。但是请记住,在测试脚本后将其删除,您不希望用户看到太多有关任何错误的信息,因为它只会帮助黑客。

ini_set('display_errors', 1); 
ini_set('log_errors',1); 
error_reporting(E_ALL); 
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);


$sql = "INSERT INTO tbl_order_items
                (Prod_name, Vial_type, Prod_price, Prod_qty, Prod_total) 
            VALUES (?, ?, ?, ?, ?)";
$stmt = $connect->prepare($sql);
if ( !$stmt) {
    // report error and exit, you can do this
    exit;
}

// begin Transaction
$connect->begin_transaction();

$counter = count($the_order);
for($i = 0;$i<$counter;$i++){
    list($quantity, $name_prod, $vial_type, $price) = $the_order[$i];
    $priceitem = $price/$quantity;

    $stmt->bind_param('sssss', 
                $name_prod,
                $vial_type, 
                $priceitem, 
                $quantity,  
                $price);
        // Execute query
    $res = $stmt->execute();
    if ( !$res ) {
        echo $connect->error;
        $connect->rollback();
        exit;
    }
    $result = $stmt->affected_rows;

}
$connect->commit();

最后,您可能想检查列的数据类型。您正在使用'sssss',因此将所有内容都视为文本,但是例如quantitypricepriceitem可能不是文本。

但是,如果至少设置了错误报告,则与数据类型相关的错误应该会出现。

我还注意到您的price字段包含RON(货币代码)。最好不要将其放在price字段中。如果您网站上的所有内容都存储在RON中,那么如果不是所有内容都在RON中,那么我建议在表格中使用单独的列来保存该信息。然后,您的价格字段可以更改为数字,这将允许您使用char数据类型在SQL中进行简单的计算,这意味着您无法进行简单的算术运算,因为RON意味着列类型必须为某种字符