将PDO数组转换为Mysqli数组

Converting PDO Array to Mysqli Array

提问人:JahIsGucci 提问时间:4/11/2023 最后编辑:DharmanJahIsGucci 更新时间:4/11/2023 访问量:40

问:

我正在尝试将此PDO转换为Mysqli。这是一个简单的数组,我用它来将数据插入到数据库中的表中。

以下是原始PDO代码:


if(isset($_POST["item_name"]))
{
 include('database_connection.php');

 for($count = 0; $count < count($_POST["item_name"]); $count++)
 {
  $data = array(
   ':item_name'   => $_POST["item_name"][$count],
   ':item_category_id'  => $_POST["item_category"][$count],
   ':item_sub_category_id' => $_POST["item_sub_category"][$count]
  );

  $query = "
   INSERT INTO items 
       (item_name, item_category_id, item_sub_category_id) 
       VALUES (:item_name, :item_category_id, :item_sub_category_id)
  ";

  $statement = $connect->prepare($query);

  $statement->execute($data);
 }

 echo 'ok';
}


这是我将其更改为 mysqli 的尝试:


<?php

//insert.php;

if(isset($_POST["item_name"]))
{
 include('database_connection.php');

 for($count = 0; $count < count($_POST["item_name"]); $count++)
 {
  $data = array(
   ':item_name'   => $_POST["item_name"][$count],
   ':item_category_id'  => $_POST["item_category"][$count],
   ':item_sub_category_id' => $_POST["item_sub_category"][$count]
  );

  $statement=$connect->prepare(" 
   INSERT INTO items 
       (item_name, item_category_id, item_sub_category_id) 
       VALUES (:item_name, :item_category_id, :item_sub_category_id)
  ");


  $statement->execute($data);
 }

 echo 'ok';
}


?>

我似乎想不通这一点。“for”循环和数组看起来可以保持不变 - 所以我刚刚编辑了我的 mysqli 准备和执行,但它不起作用。

php 数组 mysqli pdo

评论

3赞 RiggsFolly 4/11/2023
你为什么要为这种转换而烦恼
3赞 aynber 4/11/2023
MySQLI不使用命名参数,因此不起作用。我建议阅读准备好的语句bind_param,其中解释了mysqli如何使用参数绑定:item_name, :item_category_id, :item_sub_category_id
1赞 RiggsFolly 4/11/2023
因为我的整个项目都在MySQLI中然后我不得不问PDO代码是从哪里来的
2赞 M. Eriksson 4/11/2023
旁注:如果可能的话,我宁愿建议您将 mysqli 切换到 PDO。PDO 有一个更简单的 API,并具有一些额外的功能(如命名参数、不同的获取模式等),使生活更轻松。
2赞 M. Eriksson 4/11/2023
至少您不需要重写查询,因为 PDO 同时支持未命名 () 和命名 () 参数。?:foo

答:

1赞 RiggsFolly 4/11/2023 #1

MySQLI 不支持命名参数,参数使用占位符?

此外,您可以准备一次语句,然后多次绑定和执行,省去了服务器多次编译和优化同一语句的行程。注意这在 PDO 中也是可能的:)

<?php

//insert.php;
include 'database_connection.php';

if (isset($_POST["item_name"])) {
    //prepare once, bind and execute multiple times in the loop
    $statement = $connect->prepare("INSERT INTO items 
                                    (item_name, item_category_id, item_sub_category_id) 
                             VALUES (?,?,?)");

    foreach ($_POST["item_name"] as $i => $val) {
        $statement->bind_param(
            'sss',
            $val,
            $_POST["item_category"][$i],
            $_POST["item_sub_category"][$i]
        );

        $statement->execute();
    }
    echo 'ok';
}
?>

或者正如达曼所说,你可以

<?php

//insert.php;
include 'database_connection.php';

if (isset($_POST["item_name"])) {
    //prepare once, bind and execute multiple times in the loop
    $statement = $connect->prepare("INSERT INTO items 
                                    (item_name, item_category_id, item_sub_category_id) 
                             VALUES (?,?,?)");

    foreach ($_POST["item_name"] as $i => $val) {

        $statement->execute( [
                                $val, 
                                $_POST["item_category"][$i],
                                $_POST["item_sub_category"][$i]
                             ] 
                            );
    }
    echo 'ok';
}
?>

评论

0赞 JahIsGucci 4/11/2023
哇,谢谢伙计,你是救命恩人!我试图在 phpdelusions.net/mysqli_examples/insert 上学习完全相同的东西。不过,您的代码看起来有点不同,因为您在 foreach 循环中添加了“$i=$val”。你有没有偶然的资源,所以我可以学习你的方法?:)如果不是一切都很好 - 无论如何我都很感激答案
0赞 RiggsFolly 4/11/2023
我这样做的方式没有什么特别不寻常的。只是不记得我上次在PHP中编写一个循环是什么时候,除了测试大得离谱的表数据加载之外,其他任何事情for
1赞 Dharman 4/11/2023
顺便说一句,没有必要使用 .只需将数组传入即可bind_paramexecute
0赞 RiggsFolly 4/11/2023
这完全是关于循环和事实,你可以做,然后使用 the 来索引其他数组,假设它们的大小都相同foreachforeach( $arr as $key => $value)key