【发布时间】:2014-04-16 03:17:32
【问题描述】:
嗨,我是 PHP 的新手,但我一直在学习,这是我第一次来 Stackoverflow 并实际上问了一个问题,所以请放轻松:P
我正在创建一个工作请求系统,但我被困在一个特定的地方,我想我错过了一些非常简单的东西,所以我希望你能帮助我。
我正在创建的表单当前有许多复选框(选择)和文本框(数量),并且采购项目通过此查询从数据库中列出
<?php
$query="SELECT * FROM RequestProcurementItems ORDER BY ITEMID";
$result = odbc_exec($connection_id,$query);
$requestitems="";
while ($row = odbc_fetch_array($result)) {
$itemid=odbc_result($result,"ITEMID");
$itemtype=odbc_result($result,"ITEMTYPE");
$itemdesc=odbc_result($result,"ITEMDESCRIPTION");
foreach($row as $cell)
echo "<tr>";
echo "<td colspan='2'>". $itemid ." - ". $itemtype ." - ". $cell ."</td><td colspan='2'><input type='checkbox' name='additem[]' value='".$itemid."'><input type='text' name='addquantity[]'>";
echo "</td>";
echo "</tr>\n";
}
?>
复选框被添加到数组“additem”中,文本框被添加到数组“addquantity”中
提交表单时,复选框和数量最后执行,以便它们可以获取 MAX(ID) 并索引到另一个表。
这是输入复选框和数量字段的代码。
<?php
$sqlgetmaxid = "SELECT MAX(RequestID) FROM RequestFormProcurement";
$resultmaxid = odbc_exec($connection_id,$sqlgetmaxid);
while( $row = odbc_fetch_array($resultmaxid) ) {
$qarray = array_filter($_POST['addquantity']);
// Query to Add Items selected from list.
if(!empty($_POST['additem'])){
foreach($_POST['additem'] as $itemid => $quantity) {
//echo $_POST['additem'][$itemid].$_POST['addquantity'][$itemid];
$sql = "INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (".implode(",",$row).", ".$_POST['additem'][$itemid].", ".$qarray[$itemid].")";
print_r($sql);
odbc_exec($connection_id,$sql);
odbc_commit($connection_id) or die (comm_error);
}
}
}
?>
问题是它有效...只有选中的复选框被输入到数组中,但是数量的空文本字段被输入到“addquantity”数组中,所以我尝试使用
$qarray = array_filter($_POST['addquantity']);
但它仍然包含 NULL 字段。因此,一旦提交查询,我在一个空格后的查询中就会丢失一个数量(对不起,如果我不善于解释!!)
这就是查询失败的原因(注意 10、11、12、14 我没有检查选项 13,所以现在选项 14 的数量丢失了,我保持 id 和数量相同以用于测试目的)。
INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 10, 10)
INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 11, 11)
INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 12, 12)
Notice: Undefined offset: 3 in I:\IT\Web_Request_Forms_Database\UwAmp\www\includes\HWS\NewHWSWRequestForm.php on line 282
INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 14, )
非常感谢您提前提供的任何帮助。
编辑:我改变了什么
我已经更改了 sql 查询
$sqlgetmaxid = "SELECT MAX(RequestID) FROM RequestFormProcurement";
$resultmaxid = odbc_exec($connection_id,$sqlgetmaxid);
while( $row = odbc_fetch_array($resultmaxid) ) {
print_r($_POST['addquantity']);
var_dump($_POST['addquantity']);
// Query to Add Items selected from list.
if(!empty($_POST['additem'])){
foreach($_POST['additem'] as $itemid => $quantity) {
//echo $_POST['additem'][$itemid].$_POST['addquantity'][$itemid];
$sql = "INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (".implode(",",$row).", ".$_POST['additem'][$itemid].", '".$_POST['addquantity'][$quantity]."')";
print_r($sql);
odbc_exec($connection_id,$sql);
odbc_commit($connection_id) or die (comm_error);
}
}
当我们指定键时,我们没有调用数量的字符串。
$sql = "INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (".implode(",",$row).", ".$_POST['additem'][$itemid].", '".**$_POST['addquantity'][$quantity].**"')";
输出
Array ( [10] => 100 [11] => 111 [12] => 0 [13] => 1333 [14] => 0 [15] => 0 [16] => 0 [17] => 177 [18] => 0 [19] => 0 [20] => 20 [21] => 0 [22] => 0 [23] => 0 [24] => 0 [25] => 0 [26] => 0 [27] => 0 )
array (size=18)
10 => string '100' (length=3)
11 => string '111' (length=3)
12 => string '0' (length=1)
13 => string '1333' (length=4)
14 => string '0' (length=1)
15 => string '0' (length=1)
16 => string '0' (length=1)
17 => string '177' (length=3)
18 => string '0' (length=1)
19 => string '0' (length=1)
20 => string '20' (length=2)
21 => string '0' (length=1)
22 => string '0' (length=1)
23 => string '0' (length=1)
24 => string '0' (length=1)
25 => string '0' (length=1)
26 => string '0' (length=1)
27 => string '0' (length=1)
INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 10, '100')INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 11, '111')INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 13, '1333')INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 17, '177')INSERT INTO ProcurementDetail (RequestID, ITEMID, Quantity) VALUES (1001, 20, '20')
【问题讨论】:
-
如果您在尝试执行数据库事务之前处理和清理您的输入,这将有所帮助。您应该使用库与您的数据库对话。字符串连接和
$_POST不是在构建 SQL 查询时应该一起看到的东西。它使您容易受到 SQL 注入攻击。你可以在这里阅读:en.wikipedia.org/wiki/SQL_injection -
我推荐看看这个网站,了解一些 PHP 开发的最佳实践:phptherightway.com。在 Databases 下有一个名为 Abstraction 的部分,提供了一些您可以使用的支持通用数据库服务器的库示例。像该指南建议的那样,开始使用大量其他工作部分似乎更难,但它会让你成为更好的开发人员,未来的“你”会更快乐。
-
谢谢乔纳森,感谢您提供的链接,我一定会看一看,我一直在努力改进我的开发方式。但是对于我目前的解决方案,我并不担心 SQL 注入,该站点仅限于我们的子网,并且仅用于跟踪 IT 请求。但是感谢您的回复,我会检查网站!
-
一个简单的解决方法是将文本框 HTML 中的值设置为 0。
-
但这不会使我的数组与“additem”数组更加脱节吗?因为我真的需要他们 1-1。