我正试图为我的家人编写一个简单的杂货清单web应用程序,让用户在其中检查他们想添加到清单中的商品,然后将其添加到表中以备将来检索。但是我在试图将数组和用户名一起插入MySQL数据库时遇到了麻烦。我四处寻找答案,但找不到满足以下条件的答案:
- 插入数组和非数组
- 不使用不推荐使用的mysql_函数
理想情况下,我希望使用PDO,因为我还有一些其他使用PDO的查询。我知道数组正在被传递,因为我在要执行查询的页面上成功地打印了它。以下是我到目前为止所拥有的。
HTML表单(复选框值从另一个MySQL表中填充):
<div class="ui-body">
<? while($row = $resultRedMeat->fetch(PDO::FETCH_ASSOC)){
echo '<label><input type="checkbox" id="groceryListItem[]" name="groceryListItem[]" value="'.$row['food'].'">'.$row['food'].'</label>';
}?>
</div>
插入的PHP代码
$groceryListItems = $_POST['groceryListItem'];
$q = $db->prepare("INSERT INTO `grocerylist`
SET `username` = $username, `food` = ?");
foreach((array)$groceryListItems as $groceryListItem){
$q ->execute($username, array($groceryListItem['groceryListItem']));
}
我在错误日志中得到的错误是:
- PHP警告:非法的字符串偏移量"groceryListItem"
- PHP警告:PDOStatement::execute()最多需要1个参数,给定2个
虽然传递的所有值都来自数据库,并且没有用户输入,但如果你们认为防止注入仍然很好,在这种情况下,我也不介意对此提出一些建议。
非常感谢你的帮助!
有几件事。
你的$groceryListItems
不是按照你的想法构建的。使用print_r($groceryListItems)
查看数组,并确定如何访问所需的元素。
关于。您的评论:
print_r($grocery_list_items);
Array ( [0] => Ground Beef (Extra Lean),
[1] => Flank Steak,
[2] => Roast )
如果你循环通过这个数组;
$foreach( $grocery_list_items as $key=>$value ){
//$key will be 0 then 1 the 2
//$value will be Ground Beef (Extra Lean) then Flank Steak then Roast
}
在您的查询中,您有SET username = $username
,但让您尝试将username作为参数传递。用?
替换$username
PDO::execute
期望传递给查询的一个参数数组。阅读我因此,将$username和greoceyitem组合到一个数组中以传递执行。
此外,您的查询混合了UPDATE和INSERT语法。如果您正在尝试运行INSERT查询,那么它应该是;
INSERT INTO `grocerylist` (`username`,`food`) VALUES (?,?);