这是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]: Invalid parameter number:绑定变量的数量与令牌的数量不匹配
我可以得出结论,最后一个例子是有效的SQL语法。但是为什么会出错呢?Number, RecordDay, RecordMonth=?和$insertQuery[] = '(?, ?, ?)';
3个变量和3个令牌?还是我错了?
如果$insertQuery[] = '(?, ?)';
相同SQLSTATE[HY093]: Invalid parameter number:绑定变量个数与令牌个数不匹配
,请帮助。我卡住了....不知道
工作代码! !
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注入,添加
$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/