PDO 从动态 html table 中插入数据库值
PDO Insert into database values from dynamic html table
我是 PHP 的新手,一直在努力应对动态 html table。我有 table 工作,我已经能够获取这些值并将它们插入到我的 Mysql 数据库上的 table 中。但是老实说,我很困惑为什么我的方法有效,为什么我不能使用 "bindValue" 的方法?
有人可以解释为什么 bindValue 方法不起作用吗?这是我的代码。如果您看到可以改进的地方,我很乐意听取您的想法。
<!-- This is from my HTML file -->
<script language="javascript">
function addRow(tableID) {
var table = document.getElementById(tableID);
var rowCount = table.rows.length;
var row = table.insertRow(rowCount);
var cell1 = row.insertCell(0);
var element1 = document.createElement("input");
element1.type = "checkbox";
element1.name="chkbox[]";
cell1.appendChild(element1);
var cell2 = row.insertCell(1);
cell2.innerHTML = "<input type='text' name='itemdesc[]' >";
var cell3 = row.insertCell(2);
cell3.innerHTML = "<input type='number' name='unitprice[]' >";
var cell4 = row.insertCell(3);
cell4.innerHTML = "<input type='number' name='quantity[]' >";
var cell4 = row.insertCell(4);
cell4.innerHTML = "<input type='number' name='linetotal[]' >";
}
function deleteRow(tableID) {
try {
var table = document.getElementById(tableID);
var rowCount = table.rows.length;
for(var i=0; i<rowCount; i++) {
var row = table.rows[i];
var chkbox = row.cells[0].childNodes[0];
if(null != chkbox && true == chkbox.checked) {
table.deleteRow(i);
rowCount--;
i--;
}
}
}catch(e) {
alert(e);
}
}
这是我的 .php 文件
for($i=0; $i < count($_POST['itemdesc']); $i++)
{
try
{
$sql = "INSERT INTO invoicelineitem SET
invoiceid = " . $last_id .",
itemdesc = '" . $_POST['itemdesc'][$i] ."',
unitprice = " . $_POST['unitprice'][$i].",
quantity = " . $_POST['quantity'][$i].",
linetotal = " . $_POST['linetotal'][$i];
$s = $pdo->prepare($sql);
$s->execute();
/* I can't get this to work
$sql = 'INSERT INTO invoicelineitem SET
invoiceid = :invoiceid,
itemdesc = :itemdesc,
unitprice = :unitprice,
quantity = :quantity,
linetotal = :linetotal';
$s = $pdo->prepare($sql);
$s->bindValue(':invoiceid', $last_id);
$s->bindValue(':quantity', $_POST['quantity'][$i]);
$s->bindValue(':untiprice', $_POST['unitprice'][$i]);
$s->bindValue(':itemdesc', $_POST['itemdesc'][$i]);
$s->bindValue(':linetotal', $_POST['linetotal'][$i]);
$s->execute();
*/
这是我收到的错误消息:
exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in /media/sf_mcpi/mcpi/invoice/index.php:216 Stack trace: #0 /media/sf_mcpi/mcpi/invoice/index.php(216): PDOStatement->execute() #1 {main}
您的查询设置为 UPDATE
查询。 INSERT
查询不同,使用这种格式:
INSERT INTO `table` (`col1`, `col2`, ...)
VALUES ('val1', 'val2', ...)
INSERT
要求您指定要插入的列,后跟相等数量的 VALUES
。
更新:感谢@Mihai 的精彩捕捉,"untiprice insted of unitprice, the placeholder and the bindparam value are different"
我是 PHP 的新手,一直在努力应对动态 html table。我有 table 工作,我已经能够获取这些值并将它们插入到我的 Mysql 数据库上的 table 中。但是老实说,我很困惑为什么我的方法有效,为什么我不能使用 "bindValue" 的方法?
有人可以解释为什么 bindValue 方法不起作用吗?这是我的代码。如果您看到可以改进的地方,我很乐意听取您的想法。
<!-- This is from my HTML file -->
<script language="javascript">
function addRow(tableID) {
var table = document.getElementById(tableID);
var rowCount = table.rows.length;
var row = table.insertRow(rowCount);
var cell1 = row.insertCell(0);
var element1 = document.createElement("input");
element1.type = "checkbox";
element1.name="chkbox[]";
cell1.appendChild(element1);
var cell2 = row.insertCell(1);
cell2.innerHTML = "<input type='text' name='itemdesc[]' >";
var cell3 = row.insertCell(2);
cell3.innerHTML = "<input type='number' name='unitprice[]' >";
var cell4 = row.insertCell(3);
cell4.innerHTML = "<input type='number' name='quantity[]' >";
var cell4 = row.insertCell(4);
cell4.innerHTML = "<input type='number' name='linetotal[]' >";
}
function deleteRow(tableID) {
try {
var table = document.getElementById(tableID);
var rowCount = table.rows.length;
for(var i=0; i<rowCount; i++) {
var row = table.rows[i];
var chkbox = row.cells[0].childNodes[0];
if(null != chkbox && true == chkbox.checked) {
table.deleteRow(i);
rowCount--;
i--;
}
}
}catch(e) {
alert(e);
}
}
这是我的 .php 文件
for($i=0; $i < count($_POST['itemdesc']); $i++)
{
try
{
$sql = "INSERT INTO invoicelineitem SET
invoiceid = " . $last_id .",
itemdesc = '" . $_POST['itemdesc'][$i] ."',
unitprice = " . $_POST['unitprice'][$i].",
quantity = " . $_POST['quantity'][$i].",
linetotal = " . $_POST['linetotal'][$i];
$s = $pdo->prepare($sql);
$s->execute();
/* I can't get this to work
$sql = 'INSERT INTO invoicelineitem SET
invoiceid = :invoiceid,
itemdesc = :itemdesc,
unitprice = :unitprice,
quantity = :quantity,
linetotal = :linetotal';
$s = $pdo->prepare($sql);
$s->bindValue(':invoiceid', $last_id);
$s->bindValue(':quantity', $_POST['quantity'][$i]);
$s->bindValue(':untiprice', $_POST['unitprice'][$i]);
$s->bindValue(':itemdesc', $_POST['itemdesc'][$i]);
$s->bindValue(':linetotal', $_POST['linetotal'][$i]);
$s->execute();
*/
这是我收到的错误消息:
exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in /media/sf_mcpi/mcpi/invoice/index.php:216 Stack trace: #0 /media/sf_mcpi/mcpi/invoice/index.php(216): PDOStatement->execute() #1 {main}
您的查询设置为 UPDATE
查询。 INSERT
查询不同,使用这种格式:
INSERT INTO `table` (`col1`, `col2`, ...)
VALUES ('val1', 'val2', ...)
INSERT
要求您指定要插入的列,后跟相等数量的 VALUES
。
更新:感谢@Mihai 的精彩捕捉,"untiprice insted of unitprice, the placeholder and the bindparam value are different"