【问题标题】:How to insert mulitple POST value from array using PHP如何使用 PHP 从数组中插入多个 POST 值
【发布时间】:2015-04-21 07:33:50
【问题描述】:

这是我的代码,当我 ECHO 输出它的 show all POST array 时,但是当 mysqli_query 操作运行时它只插入最后一个值。如何在查询中插入所有数据?谁能帮帮我...

$ser = $_POST['serial'];
foreach ($ser as $seria) {
    echo $serial = $seria;
}

$re = $_POST['ref_no'];
foreach ($re as $refe) {
    echo $ref = $refe;
}

$des = $_POST['desc'];  
foreach ($des as $desce) {
    echo $desc = $desce;
}

$uni = $_POST['unitss'];
foreach ($uni as $units) {
    echo $unit = $units;
}

$qt = $_POST['qty'];
foreach ($qt as $qtys) {
    echo $qty = $qtys;
}

$pric = $_POST['price'];
foreach ($pric as $prices) {
    echo $price = $prices;
}

$amoun = $_POST['amount'];
foreach ($amoun as $amounts) {
    echo $amount = $amounts;
}

mysqli_query($con, "INSERT into purchase_order (po_id, po_no, serial_no, ref_no, description, unit, qty, price, amount, status) VALUES ('', '".$po_nom."', '".$mr_no."', '".$serial."', '".$ref."', '".$desc."', '".$unit."', '".$qty."', '".$price."', '".$amount."', 'Pending')");

【问题讨论】:

  • 你的表单结构是什么?
  • 这不是完成任务的正确方法...您可以打印所有内容,但只能插入一个内容,因为您尝试插入循环的最后一个值..

标签: php mysqli


【解决方案1】:

试试这个

$ser = $_POST['serial'];
foreach($ser as $keys=>$vals){
mysqli_query($con, "INSERT into purchase_order (po_id, serial_no, ref_no, description, unit, qty, price, amount, status) VALUES ('', '".$vals."', '".$_POST['ref'][$keys]."', '".$_POST['desc'][$keys]."', '".$_POST['unitss'][$keys]."', '".$_POST['qty'][$keys]."', '".$_POST['price'][$keys]."', '".$_POST['amount'][$keys]."', 'Pending')");
}

或者你也可以这样做

$ser = $_POST['serial'];
foreach($ser as $keys=>$vals){
$values_array[]="('', '".$vals."', '".$_POST['ref'][$keys]."', '".$_POST['desc'][$keys]."', '".$_POST['unitss'][$keys]."', '".$_POST['qty'][$keys]."', '".$_POST['price'][$keys]."', '".$_POST['amount'][$keys]."', 'Pending')";

}
$values=implode(",",$values_array);
mysqli_query($con, "INSERT into purchase_order (po_id, serial_no, ref_no, description, unit, qty, price, amount, status) VALUES ".$values." ");

【讨论】:

  • 将查询放置在循环中是非常低效的,它会导致在服务器上为循环中的每个实例进行单独的事务调用。完整的字符串应该在循环中构建并且查询只执行一次。
【解决方案2】:

这里有一个相当大的假设,即所有数组都具有相同的大小:

$sql='';
$n=len($_POST['serial']);
for ($i=0;$i<$n;$i++) {
    $amount = $_POST['amount'][$i];
    $price = $_POST['price'][$i];
    $qty=$_POST['qty'][$i];
    $unit=$_POST['unitss'][$i];
    $desc=$_POST['desc'][$i];
    $ref=$_POST['ref_no'][$i];
    $serial=$_POST['serial'][$i];
    $sql_part="INSERT into purchase_order (po_id, po_no, serial_no, ref_no, description, unit, qty, price, amount, status) VALUES ('', '".$po_nom."', '".$mr_no."', '".$serial."', '".$ref."', '".$desc."', '".$unit."', '".$qty."', '".$price."', '".$amount."', 'Pending')";
    $sql=$sql.';'.$sql_part;
}
mysqli_query($con, $sql);

另外,请注意,由于SQL injections,直接从$_POST 变量向数据库插入数据不是一个好习惯

【讨论】:

  • 我从来没有找到一个 PHP 库可以在单个事务中接受多部分 sql 语句,以 ; 结尾(诚​​然,我从来没有打扰过 mysqli)。但是,为什么只运行一条 SQL 语句就可以运行多个 SQL 语句呢?
【解决方案3】:

试试这个

$serial = $_POST['serial'];
$ref = $_POST['ref_no'];
$desc = $_POST['desc'];  
$unit = $_POST['unitss'];
$qty = $_POST['qty'];
$price = $_POST['price'];
$amount = $_POST['amount'];

mysqli_query($con, "INSERT into purchase_order (po_id, po_no, serial_no, ref_no, description, unit, qty, price, amount, status) VALUES ('', '".$po_nom."', '".$mr_no."', '".$serial."', '".$ref."', '".$desc."', '".$unit."', '".$qty."', '".$price."', '".$amount."', 'Pending')");

【讨论】:

  • 我相信这会导致一些“将类型数组转换为类型字符串不兼容”消息。 OP 使用循环来回显每个 $_POST 项的值,这表明每个 $_POST 值都是它自己的数组。
【解决方案4】:

您的回声显示所有值的原因是它们都位于您正在运行的循环中以遍历数组。您所做的是每次遍历循环时覆盖循环内每个变量中的值,将其回显,然后用数组中的下一个值再次覆盖它。

只有在所有数组大小相同的情况下,您才能执行您想要执行的操作,然后您需要在循环内而不是在循环之后构建查询字符串。

我对mysqli不熟悉,所以我给你一个使用PDO的例子(这是未经测试的,并不意味着只是插入你的代码,它只是为了让逻辑和过程更清晰):

$con= new PDO("mysql:host=<host>;dbname=<dbName>", "dbUsr", "dbPwd");
$sql = "INSERT INTO purchase_order (po_id, po_no, serial_no, ref_no, description, unit, qty, price, amount, status) VALUES";
$masterArray = [];
for($i = 0; $i < count($_POST['serial']); $i++){
  $masterArray[] = array('serial=>$_POST['serial'], 'ref_no'=>$_POST['ref_no'], 'desc'=>$_POST['desc'], 'unitss'=>$_POST['unitss'], 'qty'=>$_POST['qty'], 'price'=>$_POST['price'], 'amount'=>$_POST['amount'])
  $sql .= "(?,?,?,?,?,?,?,?,?,"Pending") ";
}
$stmt = $con->prepare($sql);
$marker = 1;
foreach($masterArray as $idx=>$row){
  foreach($row as $title=>$value){
    $stmt->bindParam($marker, $value)
    $marker++;
  }
}
$stmt->execute();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    相关资源
    最近更新 更多