当我尝试仅更新表单表中的一个单元格时,只更新最后一行。 请帮我解决问题并教我如何更新每一行。 谢谢,谢伊。
相关的PHP代码:
CREATE OR REPLACE TYPE staff_res_t AS OBJECT (staff_id NUMBER)
CREATE TYPE staff_res_tab AS TABLE OF staff_res_t
CREATE OR REPLACE FUNCTION getdept( in_dept NUMBER )
RETURN staff_res_tab
PIPELINED
IS
CURSOR c_staff
IS
SELECT staff_id
FROM you_table
WHERE dept = in_dept;
out_rec staff_res_t := staff_res_t( NULL );
BEGIN
FOR rec_staff IN c_staff
LOOP
out_rec.staff_id := rec_staff.staff_id;
PIPE ROW ( out_rec );
END LOOP;
RETURN;
END;
SELECT * FROM TABLE( getdept( 443 ) )
这里是相关的HTML代码:
<?php
if(isset($_POST["submit"])) {
$callid = $_POST['callid'];
$statusOfWork = $_POST['statusOfWork'];
$areaNumber = $_POST['areaNumber'];
$connection = mysqli_connect('localhost','root','', 'nitzanpi_calls');
if (!$connection){
die("Database connection failed" .mysqli_connect_error());
}
mysqli_set_charset($connection,"utf8");
if($areaNumber == '1'){
$sql1 = "UPDATE calls SET statusOfWork = '".$statusOfWork."' WHERE areaNumber = '1' AND callid = '".$callid."'";
}
elseif($areaNumber == '2'){
$sql1 = "UPDATE calls SET statusOfWork = '".$statusOfWork."' WHERE areaNumber = '2' AND callid = '".$callid."'";
}
elseif($areaNumber == '3'){
$sql1 = "UPDATE calls SET statusOfWork = '".$statusOfWork."' WHERE areaNumber = '".$areaNumber."' AND callid = '".$callid."'";
}
elseif($areaNumber == '4'){
$sql1 = "UPDATE calls SET statusOfWork = '".$statusOfWork."' WHERE areaNumber = '4' AND callid = '".$callid."'";
}
elseif($areaNumber == '5'){
$sql1 = "UPDATE calls SET statusOfWork = '".$statusOfWork."' WHERE areaNumber = '5' AND callid = '".$callid."'";
}
elseif($areaNumber == '6'){
$sql1 = "UPDATE calls SET statusOfWork = '".$statusOfWork."' WHERE areaNumber = '6' AND callid = '".$callid."'";
}
$query1 = mysqli_query($connection, $sql1);
if (!$query1) {
die ('SQL Error: '. mysqli_error($connection));
}
}
?>
答案 0 :(得分:1)
在每个表行中,您具有相同的命名隐藏输入字段,在提交表单时,仅提交最后一个唯一命名元素的值。
您可以使用callid ...
为隐藏字段指定唯一名称<input type="hidden" name="areaNumber_<?php echo $values['callid']?>" value="<?php echo $values['areaNumber']?>">
<input type="hidden" name="statusOfWork_<?php echo $values['callid']?>" value="<?php echo $values['statusOfWork']?>">
...并且还将提交按钮的值更改为callid。
在PHP方面,您现在可以使用
访问值$callid = $_POST['submit'];
$statusOfWork = $_POST['statusOfWork_'.$callid];
$areaNumber = $_POST['areaNumber_'.$callid];
答案 1 :(得分:1)
修复程序位于HTML表单中。因为你使用foreach来创建具有相同名称的多个字段副本,所以只有最后一个具有相同名称的字段被发送到您的PHP文件。您只需在每个字段名称后添加[],以便所有字段中的值都存储在数组中。
<input type="hidden" name="callid[]" value="<?php echo $values['callid']?>">
你也可以添加callid作为每一行的键。
<input type="hidden" name="areaNumber[<?php echo $values['callid']?>]" value="<?php echo $values['areaNumber']?>">
<input type="hidden" name="statusOfWork[<?php echo $values['callid']?>]" value="<?php echo $values['statusOfWork']?>">
这会将所有表单数据放入如下数组:
Array
(
[callid] => Array
(
[0] => 2
[1] => 3
)
[areaNumber] => Array
(
[0] => 2
[1] => 3
)
[statusOfWork] => Array
(
[0] => 2
[1] => 3
)
)
然后,您需要相应地修改PHP代码。另请注意,您的未转义的SQL语句很容易以当前形式注入,并且从PHP 5.5开始不推荐使用Jakub Matczak。建议使用面向对象的procedural mysql fucntions或{{ 3}}。您应该使用mysqli来阻止SQL注入。如果你想坚持程序风格,那么使用PDO来逃避你的价值观。
你也不应该使用mysql&#39; root&#39;用户查询。最好创建具有需要执行的功能的权限的另一个用户。
代码的面向对象prepared statements版本的一个非常粗略的例子是:
if(isset($_POST["submit"])) {
$callid = $_POST['callid'];
$statusOfWork = $_POST['statusOfWork'];
$areaNumbers = $_POST['areaNumber'];
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
$mysqli->set_charset("utf8");
foreach($areaNumers as $key => $areaNumer) {
if ($stmt = $mysqli->prepare("UPDATE calls SET statusOfWork = ? WHERE areaNumber = ? AND callid = ?")) {
/* bind parameters for markers */
$stmt->bind_param("s", $statusOfWork[$key]);
$stmt->bind_param("a", $areaNumer);
$stmt->bind_param("c", $callid[$key]);
/* execute query */
$stmt->execute();
$stmt->close();
}
/* close connection */
$mysqli->close();
}