gpt4 book ai didi

php - 带位置占位符的 ON DUPLICATE KEY UPDATE 的语法

转载 作者:搜寻专家 更新时间:2023-10-31 22:07:21 25 4
gpt4 key购买 nike

这是REPLACE语法

$sql = "REPLACE INTO 2_1_journal (Number,RecordDay, RecordMonth) VALUES ";
$insertQuery = array();
$insertData = array();
foreach ($_POST['row_id'] as $i => $row_id) {
$insertQuery[] = '(?, ?, ?)';
$insertData[] = $row_id;
$insertData[] = $_POST['date_day'][$i];
$insertData[] = $_POST['date_month'][$i];
}
if (!empty($insertQuery)) {
$sql .= implode(', ', $insertQuery);
$stmt = $db->prepare($sql);
$stmt->execute($insertData);
}

然而,阅读它而不是 REPLACE 更好地使用 ON DUPLICATE KEY UPDATE

努力改变成这样

$sql = "INSERT INTO 2_1_journal (Number,RecordDay, RecordMonth) VALUES ON DUPLICATE KEY UPDATE (RecordDay, RecordMonth) ";
$insertQuery = array();
$insertData = array();
foreach ($_POST['row_id'] as $i => $row_id) {
$insertQuery[] = '(?, ?, ?, ?, ?)';
$insertData[] = $row_id;
$insertData[] = $_POST['date_day'][$i];
$insertData[] = $_POST['date_month'][$i];
$insertData[] = $_POST['date_day'][$i];
$insertData[] = $_POST['date_month'][$i];
}
if (!empty($insertQuery)) {
$sql .= implode(', ', $insertQuery);
$stmt = $db->prepare($sql);
$stmt->execute($insertData);
}

但不起作用(既不插入也不更新)

哪里不对?

如果投反对票,请在评论中写下原因(为了避免写出导致投反对票的东西)

更新

修改代码

$sql = "INSERT INTO 2_1_journal (Number, RecordDay) VALUES ON DUPLICATE KEY UPDATE RecordDay";
$insertQuery = array();
$insertData = array();
foreach ($_POST['row_id'] as $i => $row_id) {
$insertQuery[] = '(?, ?)';
$insertData[] = $row_id;
$insertData[] = $_POST['date_day'][$i];
}

get SQLSTATE[42000]: Syntax error or access violation: 1064 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本对应的手册,了解在第 1 行的“ON DUPLICATE KEY UPDATE RecordDay('21', ''), ('22', '')' 附近使用的正确语法

改成了这个

$sql = "INSERT INTO 2_1_journal (Number, RecordDay) VALUES ON DUPLICATE KEY UPDATE RecordDay=VALUES(Number)";
$insertQuery = array();
$insertData = array();
foreach ($_POST['row_id'] as $i => $row_id) {
$insertQuery[] = '(?, ?)';
$insertData[] = $row_id;
$insertData[] = $_POST['date_day'][$i];

get SQLSTATE[42000]: Syntax error or access violation: 1064 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本对应的手册,了解在第 1 行的“ON DUPLICATE KEY UPDATE RecordDay=VALUES(Number)('21', ''), ('22', '')' 附近使用的正确语法

修改代码

$sql = "INSERT INTO 2_1_journal (Number, RecordDay) VALUES ON DUPLICATE KEY UPDATE RecordMonth=?";
$insertQuery = array();
$insertData = array();
foreach ($_POST['row_id'] as $i => $row_id) {
$insertQuery[] = '(?, ?, ?)';
$insertData[] = $row_id;
$insertData[] = $_POST['date_day'][$i];
$insertData[] = $_POST['date_month'][$i];

get SQLSTATE[HY093]: 参数编号无效:绑定(bind)变量的数量与标记的数量不匹配

我可以得出最后一个示例是有效 SQL 语法的结论吗?但是为什么会出错呢?数字、记录日、记录月=?和 $insertQuery[] = '(?, ?, ?)'; 3 个变量和 3 个标记?还是我错了?

如果 $insertQuery[] = '(?, ?)'; 一样SQLSTATE[HY093]: 参数编号无效:绑定(bind)变量的数量与标记的数量不匹配

请帮忙。我卡住了....不知道

工作代码!!!

try {
$sql = "INSERT INTO 2_1_journal (Number, RecordDay) VALUES ";
$insertQuery = array();
$insertData = array();
foreach ($_POST['row_id'] as $i => $row_id) {
$insertQuery[] = '(?, ?)';
$insertData[] = $row_id;
$insertData[] = $_POST['date_day'][$i];
}
if (!empty($insertQuery)) {
$sql .= implode(', ', $insertQuery) . 'ON DUPLICATE KEY UPDATE RecordDay = VALUES(RecordDay);';
$stmt = $db->prepare($sql);
$stmt->execute($insertData);
}
}
catch (PDOException $e){
echo "DataBase Error: " .$e->getMessage() .'<br>';
}
catch (Exception $e) {
echo "General Error: ".$e->getMessage() .'<br>';
}

请大家发表意见。并查看 ON DUPLICATE KEY UPDATE 的位置!!!

最佳答案

每当您使用代码构建 SQL 语句时,添加一行:

echo $sql;

就在执行语句之前。这样你就可以看到你实际执行的是什么。

然后您可以将 SQL 语句直接剪切并粘贴到数据库中,看看会发生什么。

另外——为了防止SQL注入(inject),添加

$row_id = mysql_real_escape_string($POST['row_id']);
$date_day = mysql_real_escape_string($_POST['date_day']);
$date_month = mysql_real_escape_string($_POST['date_month']);

到代码的开头,然后在代码的其余部分使用 $row_id 而不是 $POST['row_id'] 。用 $date_day 代替 $_POST['date_day'],用 $date_month 代替 $_POST['date_month'],等等——对所有 POST 和 GET 变量都这样做。

检查这个: http://xkcd.com/327/

关于php - 带位置占位符的 ON DUPLICATE KEY UPDATE 的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16535726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com