具有位置占位符的ON DUPLICATE KEY UPDATE的语法

时间:2013-05-14 05:24:49

标签: php mysql

这是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);
}

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

什么是错误的?

如果是downvote,请写下评论为什么(为了避免写下导致downvote的事情)

更新

将代码更改为此

$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];
}

获取SQLSTATE [42000]:语法错误或访问冲突: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];

获取SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法出错;查看与您的MySQL服务器版本对应的手册,以便在第1行的'ON DUPLICATE KEY UPDATE RecordDay = VALUES(Number)('21',''),('22','')'附近使用正确的语法< / p>

将代码更改为此

$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];

获取SQLSTATE [HY093]:参数号无效:绑定变量数与令牌数不匹配

我可以得出结论,最后一个例子是有效的SQL语法。但为什么错误? Number,RecordDay,RecordMonth =?和$insertQuery[] = '(?, ?, ?)'; 3个变量和3个令牌?或者我错了?

如果$insertQuery[] = '(?, ?)';相同 SQLSTATE [HY093]:参数号无效:绑定变量数与令牌数不匹配

请帮忙。我被困了......不知道

工作代码!!!

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 !!!

的位置

1 个答案:

答案 0 :(得分:0)

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

echo $sql;

在执行语句之前。通过这种方式,您可以看到实际执行的内容。

然后你可以削减&amp;将SQL语句直接粘贴到数据库中,看看会发生什么。

另外 - 为了防止SQL注入,添加

$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/