PHP 从循环中转义某些 $_post 值
PHP escape certain $_post value out of loop
我得到了一个通过动态库存数量发送到数据库更新的表格,如下所示:
if($_POST) {
$cid = $_POST['prod_id'];
foreach($_POST as $key => $value){
$q = "UPDATE `stock` SET";
$q .= " in_stock=in_stock + '".$value."'";
$q .= " WHERE cid='".$cid."' AND sid='".$key."'";
echo $q.'<br />';
}
}
但是,回显查询的输出如下:
UPDATE `stock` SET in_stock=in_stock + '2' WHERE cid='2' AND sid='prod_id'
UPDATE `stock` SET in_stock=in_stock + '1' WHERE cid='2' AND sid='qty-2'
UPDATE `stock` SET in_stock=in_stock + '2' WHERE cid='2' AND sid='qty-3'
UPDATE `stock` SET in_stock=in_stock + '3' WHERE cid='2' AND sid='qty-4'
UPDATE `stock` SET in_stock=in_stock + '8' WHERE cid='2' AND sid='qty-5'
第一个查询不应包含在循环中,但它是 cid
的 $_post 输入的一部分,是否有任何解决方法可以使第一个查询脱离更新循环?
如 repox 所述,插入一个简单的 array_shift() 来删除数组的第一个元素很容易:
if($_POST) {
$cid = $_POST['prod_id'];
array_shift($_POST);
foreach($_POST as $key => $value){
...
但由于您不能依赖于您总是以相同的顺序接收表单元素(或者将来不会添加其他元素),我建议您过滤它们:
...
foreach($_POST as $key => $value){
if (!preg_match('/^qty-/', $key)) continue;
$q = "UPDATE `stock` SET";
...
我得到了一个通过动态库存数量发送到数据库更新的表格,如下所示:
if($_POST) {
$cid = $_POST['prod_id'];
foreach($_POST as $key => $value){
$q = "UPDATE `stock` SET";
$q .= " in_stock=in_stock + '".$value."'";
$q .= " WHERE cid='".$cid."' AND sid='".$key."'";
echo $q.'<br />';
}
}
但是,回显查询的输出如下:
UPDATE `stock` SET in_stock=in_stock + '2' WHERE cid='2' AND sid='prod_id'
UPDATE `stock` SET in_stock=in_stock + '1' WHERE cid='2' AND sid='qty-2'
UPDATE `stock` SET in_stock=in_stock + '2' WHERE cid='2' AND sid='qty-3'
UPDATE `stock` SET in_stock=in_stock + '3' WHERE cid='2' AND sid='qty-4'
UPDATE `stock` SET in_stock=in_stock + '8' WHERE cid='2' AND sid='qty-5'
第一个查询不应包含在循环中,但它是 cid
的 $_post 输入的一部分,是否有任何解决方法可以使第一个查询脱离更新循环?
如 repox 所述,插入一个简单的 array_shift() 来删除数组的第一个元素很容易:
if($_POST) {
$cid = $_POST['prod_id'];
array_shift($_POST);
foreach($_POST as $key => $value){
...
但由于您不能依赖于您总是以相同的顺序接收表单元素(或者将来不会添加其他元素),我建议您过滤它们:
...
foreach($_POST as $key => $value){
if (!preg_match('/^qty-/', $key)) continue;
$q = "UPDATE `stock` SET";
...