脚本发布值中的第一个数字

时间:2018-10-20 16:49:40

标签: php database forms

我正在尝试将数据发布到我的数据库中。当我发布数据时,我可以看到该值的第一个数字已发布到数据库:

示例: 我要发布值15。该脚本发布了1

我要发布值550。该脚本发布了5

我要发布值30。该脚本发布了3

有人知道原因吗?

这是我的剧本:

<input type="text" id="quantity" name="quantity" value="15" />
<input type="text" id="name" name="name" value="550" />
<input type="text" id="price" name="price" value="30" />

<?php
  for($count=0; $count<$_POST["total_item"]; $count++)
  {
    $db3 = new PDO('mysql:host=localhost;dbname=db', 'root', 'pass');

    $query3= "INSERT INTO scu_test(id, quantity, name, price) VALUES (:id, :quantity, :name, :price)";
    $stmt3 = $db3->prepare($query3);
    $exec3 = $stmt3->execute(array(
      ':id'          =>  $_SESSION['id'],
      ':quantity'    =>  $_POST["quantity"][$count],
      ':name'        =>  $_POST["name"][$count],
      ':price'       =>  $_POST["price"][$count]
    ));
    if($exec3)
      {
        header('Location: ../succ.php');
      }
  }
?>

更新1:

使用Justinas的答案,我构建了以下脚本:

动态行:

<input type="text" id="quantity1" name="quantity" value="15" />
<input type="text" id="name1" name="name" value="550" />
<input type="text" id="price1" name="price" value="30" />

<input type="text" id="quantity2" name="quantity" value="15" />
<input type="text" id="name2" name="name" value="550" />
<input type="text" id="price2" name="price" value="30" />

帖子:

<?php
  foreach($_POST as $i => $item)
  {
    $db3 = new PDO('mysql:host=localhost;dbname=db', 'root', 'pass');

    $query3= "INSERT INTO scu_test(id, quantity, name, price) VALUES (:id, :quantity, :name, :price)";
    $stmt3 = $db3->prepare($query3);
    $exec3 = $stmt3->execute(array(
      ':id'          =>  $_SESSION['id'] . '_' . $i,
      ':quantity'    =>  $_POST["quantity"],
      ':name'        =>  $_POST["name"],
      ':price'       =>  $_POST["price"]
    ));
    if($exec3)
      {
        header('Location: ../succ.php');
      }
  }
?>

当我将数据发布到数据库时,我在数据库中得到18行。发布的数据看起来像随机数据,与数量,名称或价格的值无关。

有人知道脚本出了什么问题吗?

4 个答案:

答案 0 :(得分:3)

要回答第一个问题,之所以只获取每个字段值的第一个字符,是因为您试图像访问数组一样访问这些值,但它们却是字符串,当您要求{{ 1}}从一个字符串中,您将在第一个“偏移”即第一个字符处收到该字符。

此外,由于在[0]循环中有header()行,因此在执行重定向之前,您永远不会处理一组以上的数据。重定向必须超出循环范围,以防止提前退出。

对于准备好的语句而言,准备好的语句的优点在于,您只需编写一次查询 ,而仅更新绑定变量以进行后续执行。同样,您应该只创建一个数据库连接并在脚本中继续使用它。

现在,根据个人喜好,您可以选择对整个数据批次编写一个INSERT查询,也可以执行多个单行INSERT查询。


对于问题更新,您已经创建了唯一的foreach()值,但是为id标签创建了重复的name值。这意味着提交表单时,您将不会在<input>数组中拥有所有值,而将拥有“最后迭代”的数据集。 $_POST超全局数组是使用POST值作为键生成的,并且不允许在数组的同一级别上使用重复键。因此,您将得到以下内容:

name

我能提供的最佳建议是修复您的html表单。如果您不关心与每个字段集关联的数字,请使用以下语法:

$_POST = ["quantity" => "15", "name" => "550", "price" => "30"];

<input type="text" name="quantity[]" value="15" /> <input type="text" name="name[]" value="550" /> <input type="text" name="price[]" value="30" /> 值中带有空方括号,php将在生成多维POST数组时应用索引键。

name

如果您要完全控制为$_POST = [ 0 => ["quantity" => "15", "name" => "550", "price" => "30"] ]; 生成的数字键,请在方括号中写下您想要的任何数字。

POST

这将生成:

<input type="text" name="quantity[1]" value="15" />
<input type="text" name="name[1]" value="550" />
<input type="text" name="price[1]" value="30" />

<input type="text" name="quantity[4]" value="6" />
<input type="text" name="name[4]" value="577" />
<input type="text" name="price[4]" value="39" />

关于查询,这是经过充分测试的演示代码段:

$_POST = [
    1 => ["quantity" => "15", "name" => "550", "price" => "30"],
    4 => ["quantity" => "6", "name" => "577", "price" => "39"]
];

插入的数据:

session_start();
$_SESSION['id'] = 44;
$_POST = [
    1 => ['quantity' => '15', 'name' => '550', 'price' => '30'],
    4 => ['quantity' => '16', 'name' => '551', 'price' => '30']
];

try {
    $db = new PDO("mysql:host=localhost;dbname=db;charset=utf8", "root", "");
    $stmt = $db->prepare("INSERT INTO scu_test (id, quantity, name, price) VALUES (:id, :quantity, :name, :price)");
    foreach ($_POST as $key => $set) { 
        $exec = $stmt->execute([
            ':id'          =>  "{$_SESSION['id']}_$key",
            ':quantity'    =>  $set["quantity"],
            ':name'        =>  $set["name"],
            ':price'       =>  $set["price"]
        ]);
    }
    header('Location: ../succ.php');  // if error-free, then all successful; redirect
} catch(PDOException $e){
    echo "Error message: " , $e->getMessage(); // do not show error messages to users when you go live
}

答案 1 :(得分:0)

这是因为您发布的数据不是多维数组,而是单个数组:

['quantity' => '', 'name' => '', 'price' => '']

如何修复:

[#]添加到HTML:

<div class="item">
    <input type="text" class="quantity" name="[0]quantity" value="15" />
    <input type="text" class="name" name="[0]name" value="550" />
    <input type="text" class="price" name="[0]price" value="30" />
</div>
....
<div class="item">
    <input type="text" class="quantity" name="[10]quantity" value="15" />
    <input type="text" class="name" name="[10]name" value="550" />
    <input type="text" class="price" name="[10]price" value="30" />
</div>

然后在PHP中使用foreach

$db3 = new PDO('mysql:host=localhost;dbname=db', 'root', 'pass');
$query3 = "INSERT INTO scu_test(id, quantity, name, price) VALUES (:id, :quantity, :name, :price)";

foreach($items as $i => $item) {
    $stmt3 = $db3->prepare($query3);
    $result2 = mysqli_fetch_assoc($res2);
    $exec3 = $stmt3->execute(array(
        ':id'          =>  $_SESSION['id'] . '_' . $i, // Don't know why not using Auto-Increment field
        ':quantity'    =>  $item["quantity"],
        ':name'        =>  $item["name"],
        ':price'       =>  $item["price"]
    ));

    if(!$exec3) {
        header('Location: ../error.php');
    }
}

header('Location: ../succ.php');

答案 2 :(得分:0)

尝试一下

<input type="text" id="quantity1" name="quantity[]" value="15" />
<input type="text" id="name1" name="name[]" value="550" />
<input type="text" id="price1" name="price[]" value="30" />

<input type="text" id="quantity2" name="quantity[]" value="15" />
<input type="text" id="name2" name="name[]" value="550" />
<input type="text" id="price2" name="price[]" value="30" />

您的php:

 foreach($_POST['quantity'] as $i => $item)
  {
    $db3 = new PDO('mysql:host=localhost;dbname=db', 'root', 'pass');

    $query3= "INSERT INTO scu_test(id, quantity, name, price) VALUES (:id, :quantity, :name, :price)";
    $stmt3 = $db3->prepare($query3);
    $exec3 = $stmt3->execute(array(
      ':id'          =>  $_SESSION['id'] . '_' . $i,
      ':quantity'    =>  $_POST["quantity"][$i],
      ':name'        =>  $_POST["name"][$i],
      ':price'       =>  $_POST["price"][$i]
    ));
    if($exec3)
      {
        header('Location: ../succ.php');
      }
  }

答案 3 :(得分:0)

使用多种可能性时,应在名称中使用数组

<main>
  <section id="carriers" class="integrations">
    <div class="cards">

    </div>
  </section>
</main>

在您的php脚本中,您无需在<input type="text" id="quantity1" name="quantity[]" value="15" /> <input type="text" id="name1" name="name[]" value="550" /> <input type="text" id="price1" name="price[]" value="30" /> <input type="text" id="quantity2" name="quantity[]" value="15" /> <input type="text" id="name2" name="name[]" value="550" /> <input type="text" id="price2" name="price[]" value="30" /> 中附加$i,只需使其成为主键并在数据库中设置自动递增,并且不将其包括在查询中,它将在每次插入时自动递增:

$_SESSION['id']

如果问题仍然存在,则应该按原样插入值,检查数据库中列<?php foreach($_POST['quantity'] as $i => $item) { $db3 = new PDO('mysql:host=localhost;dbname=db', 'root', 'pass'); $query3= "INSERT INTO scu_test(quantity, name, price) VALUES (:quantity, :name, :price)"; $stmt3 = $db3->prepare($query3); $exec3 = $stmt3->execute(array( ':quantity' => $_POST["quantity"][$i], ':name' => $_POST["name"][$i], ':price' => $_POST["price"][$i] )); if($exec3) { header('Location: ../succ.php'); } } ?> quantityname的长度。如果要存储整数值并且要存储price值,则需要为列int(11)quantityname设置price成为alphanumeric