[英]PHP on Submit check for records, if record exist 'confirm' update or insert new if no record
[英]Better way to check if row exist update else insert new record
如果行存在更新或插入新记录,写查询的最佳方法是什么? 我正在尝试下面列出的垃圾代码:
<?php
for ($i = 0; $i < ($_POST['count']); $i++) {
$form_details_subquestion_id = $_POST['form_details_subquestion_id'][$i];
$form_details_section_id = $_POST['form_details_section_id'][$i];
$mark = $_POST['mark'][$i];
$remark = $_POST['remark'][$i];
$result = $db->query("
SELECT *
FROM audit_section_markrecord
WHERE
form_details_subquestion_id = $form_details_subquestion_id AND
audit_section_no = $audit_no
");
if ($result->num_rows == 1) {
$query2 = "
UPDATE audit_section_markrecord
SET
mark = '$mark',
dateofmodify = '$date'
WHERE
form_details_subquestion_id = '$form_details_subquestion_id' AND
audit_section_no = '$audit_no'
";
$result2 = $db->query($query2);
$query3 = "
INSERT INTO markrecord_update_details (
audit_section_no,
form_details_subquestion_id,
form_details_section_id,
mark,
userlog,
ipaddress
) VALUES (
'$audit_no',
'$form_details_subquestion_id',
'$form_details_section_id',
'$mark',
'$user_staff',
'$ip'
)
";
$result3 = $db->query($query3);
} else if ($result->num_rows == 0) {
$query4 = "
INSERT INTO audit_section_markrecord (
audit_section_no,
form_details_subquestion_id,
form_details_section_id,
mark
) VALUES (
'$audit_no',
'$form_details_subquestion_id',
'$form_details_section_id',
'$mark'
)
";
$result4 = $db->query($query4);
} else {
echo "<script>alert('Error. Please contact IT support.')</script>";
echo "<script language='javascript'>window.location.href='index.php'</script>";
}
}
上面的代码在for循环中编写。 我尝试获取是否存在form_details_subquestion_id和audit_no,然后更新旧记录并插入到markrecord_update_details;否则插入新记录。
我不知道如何使用最容易的代码。 我只是尝试从这次旅程中学习。
最好的方法是在重复的密钥更新上插入 。
第一次查询的说明。
/* execute this directly in MySQL to add unique key constraint*/
ALTER TABLE audit_section_markrecord
ADD UNIQUE(form_details_subquestion_id, audit_section_no);
/* this query is for calling from php */
INSERT INTO audit_section_markrecord
SET
/* try to insert value */
mark = '$mark',
dateofmodify = '$date',
form_details_subquestion_id = '$form_details_subquestion_id',
audit_section_no = '$audit_no'
/* if constraint check fails, i.e. */
/* there is a row with this form_details_subquestion_id and audit_section_no */
/* then just update mark and dateofmodify */
ON DUPLICATE KEY UPDATE
mark = '$mark',
dateofmodify = '$date';
PS转义您的数据,以防止SQL注入 !
P.S2。 要检查它是否有效,请在MySQL中运行2个查询:
INSERT INTO audit_section_markrecord
SET
mark = 'good',
dateofmodify = '2015-11-10',
form_details_subquestion_id = 10,
audit_section_no = 23;
INSERT INTO audit_section_markrecord
SET
mark = 'good',
dateofmodify = '2015-11-10',
form_details_subquestion_id = 10,
audit_section_no = 23
ON DUPLICATE KEY UPDATE
mark = 'excellent',
dateofmodify = '2015-11-26';
行应具有mark = excellent和dateofmodify = 2015-11-26。
P.S3。 如果要插入重复的行,则添加唯一键会出现问题。 看一下SHOW CREATE TABLE audit_section_markrecord。 (感谢Barmar )。
另一种方法是使用REPLACE
语句。 它的工作方式类似于INSERT
语句,但是当它尝试插入记录时,如果存在具有相同键的记录,则将删除旧记录并插入新记录。 由于您不是基于以前的值进行更新,因此这可能更容易工作。
用户将需要DELETE
权限,这样才能起作用。
例:
$query4 = "REPLACE INTO `audit_section_markrecord` (audit_section_no,form_details_subquestion_id, form_details_section_id, mark) VALUES
('$audit_no', '$form_details_subquestion_id', '$form_details_section_id', '$mark') ";
@Andrew,看来我已经了解您的需求。
仅当audit_section_markrecord
已更新(未插入)时,才想更新markrecord_update_details
。
您可以通过两列的组合检查是否需要更新: form_details_subquestion_id
和audit_section_no
。
似乎您的代码工作正常。 使用它,不要使事情复杂化。
我建议您推迟倾斜的“简便方法”来工作。 添加数据转义以防止sql注入并放松。
PS当您准备就绪时,谷歌“ mysql触发更新”,“唯一键”和“重复键更新”(我的上一个示例对此有一定基础)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.