Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 脚本发布值中的第一个数字_Php_Database_Forms - Fatal编程技术网

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

Php 脚本发布值中的第一个数字,php,database,forms,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

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

例如: 我想发布值
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" />

职位:


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


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

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

['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>
试试这个

<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" />

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

<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" />

如果问题仍然存在,则应按原样插入值检查数据库中列
数量
名称
价格的长度。如果要存储整数值,并且如果要存储字母数字值,则需要为列
quantity
name
price
设置
int(11)
,而不是
varchar(250)
来回答第一个问题,之所以只获取每个字段值的第一个字符,是因为您试图访问这些值,就像它们是数组一样,但它们是字符串——当您从字符串中请求
[0]
时,您将在第一个“偏移量”(即第一个字符)处收到该字符

此外,因为在
foreach()
循环中有
header()
行,所以在执行重定向之前,您永远不会处理多个数据集。重定向必须跳出循环,以防止导致提前退出

对于预处理语句,预处理语句的美妙之处在于只编写一次查询,只更新绑定变量以供后续执行。同样,您应该只创建一个数据库连接,并在脚本中继续使用它

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


至于您的问题更新,您已经为您的
标记创建了唯一的
id
值,但重复了
name
值。这意味着提交表单时,您将不会拥有
$\u POST
数组中的所有值,而是拥有“上次迭代”的数据集。
POST
超全局数组是使用
name
值作为键生成的,不允许在数组的同一级别上使用重复键。所以你会有这样的东西:

$_POST = ["quantity" => "15", "name" => "550", "price" => "30"];
我能给你的最好建议就是修改你的html表单。如果您不关心与每组字段关联的编号,请使用以下语法:

<input type="text" name="quantity[]" value="15" />
<input type="text" name="name[]" value="550" />
<input type="text" name="price[]" value="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" />

关于查询,这里是一个经过充分测试的演示片段:

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
}
插入的数据:

  id  |  quantity  |  name  |  price
------|------------|--------|---------
44_1  |     15     |   550  |    30
44_4  |     16     |   551  |    30

为什么要在一个循环中建立与数据库的连接???
$\u POST[“quantity”]
是一个字符串,当您像数组一样访问它时,
$\u POST[“quantity”][0]
会将索引的字符拉入字符串中。为什么一开始这甚至是一个循环?就我个人而言,这整段代码毫无意义,我看不出它是如何执行的,而不会抛出一堆错误。旁注:占位符名称不匹配:':id'vs':user_id'和2个以上。您正在使用
PDO
mysqli
?我已经为多个文本字段使用了不同的id。像
id='quantity1'
id='quantity2'
id='quantity3'
等等。如何根据您的代码使用它?我在运行脚本时会出现以下错误:
注意:未定义变量:第93行的/home/…/save.php中的项
警告:为foreach()提供的参数无效在第93行的/home/…/save.php中
@John Here
$items
应该是提交的项目,因此在您的情况下,当我运行脚本并输入just POST
quantity1
name1
price1
时,我在数据库中得到18行。我现在使用
foreach($\u POST as$I=>$item)
$item[“数量”]
$item[“名称”]
$item[“价格”]
<input type="text" name="quantity[]" value="15" />
<input type="text" name="name[]" value="550" />
<input type="text" name="price[]" value="30" />
$_POST = [
    0 => ["quantity" => "15", "name" => "550", "price" => "30"]
];
<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
}
  id  |  quantity  |  name  |  price
------|------------|--------|---------
44_1  |     15     |   550  |    30
44_4  |     16     |   551  |    30