【问题标题】:PHP/PDO how to insert a FOR loop in the execute(array) definition?PHP/PDO 如何在执行(数组)定义中插入 FOR 循环?
【发布时间】:2014-01-14 04:40:00
【问题描述】:

我正在开发一个 Android 应用程序,我必须用 php 编写自己的 API。不幸的是,我在 PHP/mysql 和 API 方面的经验很少,所以我很挣扎。

我不知道要发送多少张图片到 api,所以我使用了 FOR 循环,但我不知道如何将 FOR 循环合并到数组定义中,如图所示:

为方便起见,这里是代码:

            try {
                $query_add_item_photos = "INSERT INTO 

                                            product_photos (
                                                product_id, 
                                                product_photo, 
                                                product_photo_added_by_user
                                                                        ) 
                                            VALUES (

                                                :product_id, 
                                                :product_photo_main, 
                                                :product_photo_added_by_user
                                                                            )"; 

                                            for($x = 1; $x<=count($item_photo_path); $x++) {
                                                $query_add_item_photos+= ",
                                                    (

                                                        :product_id, 
                                                        :product_photo_" . $x .", 
                                                        :product_photo_added_by_user
                                                                                    )";
                                            }

                $sth = $connection->prepare($query_add_item_photos);
                $sth->execute(
                            array(
                                  ':product_id'                     => $item_id,
                                  ':product_photo_main'             => $item_main_photo_path,
                                  ':product_photo_' .$x             => $item_photo_path[$x],
                                  ':product_photo_added_by_user'    => $user_id
                                                                                                )); 

编辑:$product_photo_main 是我以另一种方式获得的图像。

编辑:$X'S 的值总是在 1 到 4 之间

【问题讨论】:

    标签: php mysql arrays for-loop pdo


    【解决方案1】:

    execute() 方法调用之外创建数组,然后将其作为参数传入。例如,像这样:

    $array = array(
      ':product_id' => $item_id,
      ':product_photo_main' => $item_main_photo_path,
      ':product_photo_added_by_user' => $user_id,
    );
    
    foreach ($item_photo_path as $key => $path)
    {
      $query_add_item_photos += ", (
        :product_id, 
        :product_photo_" . $key .", 
        :product_photo_added_by_user
      )";
    
      $array[':product_photo_' . $key] = $path;
    }
    
    $sth = $connection->prepare($query_add_item_photos);
    $sth->execute($array);
    

    【讨论】:

    • 这看起来很有希望,只是我不明白 $path 变量的用途
    • 使用foreach($array as $key =&gt; $value) { /* $key = $x, $value = $item_photo_path[$x] in your example */ } 比使用for() 循环并跟踪$x++/$item_photo_path[$x] 要短一些。这有意义吗?
    【解决方案2】:

    我建议您在调用$sth-&gt;execute 之前创建输入参数数组,然后您可以循环遍历$item_photo_path 项并将它们添加到数组中。 类似的东西:

    $arr_input_parms = array(
        ':product_id'                     => $item_id,
        ':product_photo_main'             => $item_main_photo_path,
        ':product_photo_added_by_user'    => $user_id
    );
    for($x = 1; $x<=count($item_photo_path); $x++) {
        $arr_input_parms[':product_photo_' . $x] = $item_photo_path[$x];
    }
    $sth->execute($arr_input_parms);
    

    【讨论】:

      【解决方案3】:

      我可能是错的,但如果你有这么多的东西要插入一个列,你可以先将这些项目组成一个数组,然后将serialize()json_encode() 作为字符串插入;这样你就不需要在$sth-&gt;execute()数组中循环for

      【讨论】:

      • 我不鼓励在非序列化列中包含混合序列化数据。这是一条几乎会立即导致后悔的捷径。
      • 据我所知,unserialize() 如果您从不受信任的来源获得它,它可能是一个安全问题。如果您能分享一个链接或有用的问题示例,我将不胜感激。
      • 好吧,您不能查询序列化数据(例如查询条件、连接)。如果您的数据模型发生了变化,您将不得不编写一个脚本来运行所有记录、反序列化所有数据、调整数据模型并相应地插入/更新。这有很多开销。另一方面,这篇博文和 cmets 提出了一些关于使用 MySQL 存储序列化对象的非常有趣的观点:mysqlperformanceblog.com/2010/01/21/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多