【问题标题】:for loop convert to foreach loop with PDO in php [duplicate]for循环在php中使用PDO转换为foreach循环[重复]
【发布时间】:2017-02-12 04:22:27
【问题描述】:

从“for 循环”转换为“foreach 循环”,其中在数据插入 MySQl 后使用数组和使用 $serviceTitle 计算数组位置

for($i=0;$i<count($serviceTitle);$i++){        
    $statement = $db->prepare("INSERT INTO invoice (orderNo,customerNo,productName,
                 price,quantity,amount,createDate,createTime,
                 createBy) VALUES (?,?,?,?,?,?,?,?,?)");        
    $statement->execute(array($orderNo,$customerNo,$serviceTitle[$i],$price[$i],$quantity[$i],$amount[$i],$date,$time,$createBy));
 }

在回答问题之前检查这个问题:Insert Array values insert to single ID into mysql database using php and PDO

提前致谢

【问题讨论】:

  • 你应该在循环前只prepare你的语句一次,然后一直通过execute使用它。
  • @Amranur:为什么?什么是“$serviceTitle”?它如何/为什么提供数组位置?
  • $serviceTitle 用于来自表单输入的数组输入 () as $serviceTitle = $_POST['serviceTitle'].
  • 请在回答前检查这个问题:stackoverflow.com/questions/39816178/…谢谢
  • $orderNo,$customerNo,$price[$i],$quantity[$i],$amount[$i],$date,$time,$createBy 在哪里定义?也许如果你分享了@98​​7654327@ 的内容可能会有所帮助?

标签: php arrays for-loop pdo foreach


【解决方案1】:
<?php
    if( $_SERVER['REQUEST_METHOD']=='POST' ) {

        date_default_timezone_set('Asia/Dacca');

        /* check that all variables exist in the POST array */
        if( isset( $_POST['Submit'], $_POST['serviceTitle'], $_POST['price'], $_POST['quantity'], $_POST['amount'], $_POST['orderNo'], $_POST['customerNo'] ) ){

            /*
                Assuming that the fields serviceTitle,price,quantity and amount
                are named like field[] in the form then their values will be 
                arrays in the POST array
            */
            $serviceTitle = $_POST['serviceTitle'];
            $price = $_POST['price'];
            $quantity = $_POST['quantity'];
            $amount = $_POST['amount'];
            $orderNo = $_POST['orderNo'];
            $customerNo = $_POST['customerNo'];


            $date = date('Y-m-d');
            $time = date('h:i:s');
            $createBy = $_SESSION['sess_username'];




            /* check that key variables are arrays as you intend to access as arrays below */
            if( is_array( $serviceTitle ) && is_array( $price ) && is_array( $quantity ) && is_array( $amount ) ){

                /* prepare the sql statement */
                $sql='insert into `invoice` ( `orderno`, `customerno`, `productname`, `price`, `quantity`, `amount`, `createdate`, `createtime`, `createby` ) values (?,?,?,?,?,?,?,?,?)';
                $stmt=$db->prepare( $sql );

                if( $stmt ){
                    foreach( $serviceTitle as $i => $arr ){
                        try{
                            $args=array(
                                $orderNo,
                                $customerNo,
                                $arr[$i],
                                $price[$i],
                                $quantity[$i],
                                $amount[$i],
                                $date,
                                $time,
                                $createBy
                            );
                            $stmt->execute( $args );
                        }catch( PDOException $e ){
                            echo $e->getMessage();
                        }
                    }

                    $stmt->close();
                    $db->close();

                    $_SESSION['orderNo'] = $_POST['orderNo'];
                    $_SESSION['customerNo'] = $_POST['customerNo'];

                    ob_clean();
                    header( "location: order_confirm_tech_step2.php" );

                } else {
                    echo "error preparing sql"
                }
            } else {
                echo "error, one or more variables are not arrays"
            }
        } else {
            echo "error, one or more variables are not available"
        }
    }
?>

【讨论】:

    【解决方案2】:

    这是在 $serviceTitle 上使用 foreach 循环的代码

        $statement = $db->prepare("INSERT INTO invoice (orderNo,customerNo,productName,price,quantity,amount,createDate,createTime,createBy) VALUES (?,?,?,?,?,?,?,?,?)");
        foreach ($serviceTitle as $key => $value) {
            $statement->execute(array($orderNo,$customerNo,$value,$price[$key],$quantity[$key],$amount[$key],$date,$time,$createBy));
        }
    

    但是最好使用批量插入而不是单独插入每一行。

    【讨论】:

    • 这与 OP 的原始代码存在完全相同的问题 - 您只需在循环外准备一次语句,然后在循环中执行多次
    • @RamRaider 如果您可以自己编写代码并回答问题,而不是评论和否决答案,那会更好。然而,我刚刚给出了所要求的示例代码,进一步的改进或更改必须由 Amranur Ra​​hman 自己完成。
    • 你会看到我已经问了 OP 几个问题,但他没有回答 - 在不知道数据结构的情况下,实际上不可能准确回答。您的代码的另一件事-您将变量定义为计数器,但忽略循环中定义的$key-您可以使用它而不是另一个变量$i
    • @RamRaider 我已根据您的满意更新了代码。仍然只是为了提供信息,最好只执行一次语句而不是在循环中执行,这比在循环执行中要快得多,如下面的Sample
    • 我并不是在“对你动手”——在循环中多次准备语句的事实并不是这样做的方法。进行批量插入而不是单个查询可能确实更快(尽管在循环中使用执行方法很快),但这确实增加了形成连接 sql 的额外复杂性,从而失去了准备好的语句的好处
    猜你喜欢
    • 2021-03-12
    • 2023-02-05
    • 1970-01-01
    • 2018-12-11
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2019-04-04
    相关资源
    最近更新 更多