我正在尝试将数据发布到我的数据库中。当我发布数据时,我可以看到该值的第一个数字已发布到数据库:
示例:
我要发布值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行。发布的数据看起来像随机数据,与数量,名称或价格的值无关。
有人知道脚本出了什么问题吗?
答案 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');
}
}
?>
,quantity
和name
的长度。如果要存储整数值并且要存储price
值,则需要为列int(11)
,quantity
和name
设置price
成为alphanumeric