Php 使用位置占位符进行重复密钥更新时的语法

Php 使用位置占位符进行重复密钥更新时的语法,php,mysql,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[

这是
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

试图像这样改变

$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];
}
$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[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第1行的重复密钥更新记录日('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]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第1行的“ON replicate KEY UPDATE RecordDay=VALUES(Number)(“21”、“22”、“22”)附近使用的正确语法

将代码更改为此

$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];
}
$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]:无效参数编号:绑定变量的数量与令牌的数量不匹配

我可以得出最后一个例子是有效的SQL语法的结论吗。但为什么会出现错误呢?编号、记录日期、记录月份=?和
$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>';
}
试试看{
$sql=“插入到2\u 1\u日记帐(数字、记录日)值中”;
$insertQuery=array();
$insertData=array();
foreach($\u POST['row\u id']作为$i=>$row\u id){
$insertQuery[]='(?,?)';
$insertData[]=$row\U id;
$insertData[]=$\u POST['date\u day'][$i];
}
如果(!empty($insertQuery)){
$sql.=内爆(',',$insertQuery)。'ON DUPLICATE KEY UPDATE RecordDay=VALUES(RecordDay);';
$stmt=$db->prepare($sql);
$stmt->execute($insertData);
}
}
捕获(PDO$e){
echo“数据库错误:“..e->getMessage()”
”; } 捕获(例外$e){ echo“一般错误:“..e->getMessage()”
”; }

请发表您的评论。并查看重复密钥更新上的
位置

每当您使用代码构建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\u id而不是$POST['row\u id']。$date\u day代替$\u POST['date\u day'],$date\u month代替$\u POST['date\u month'],等等——对所有帖子都这样做并获取变量

选中此项:

在将最终查询放入
prepare
之前,您是否检查了它的外观?这根本不构成任何类型的有效SQL查询。进行向下投票的一个原因是,您应该自己进行更多的实验,这只是关于以正确的顺序连接字符串。您是否收到任何错误消息?如果是这样的话,那是什么呢?您的查询很容易被sql注入。。花点时间让它安全一点,至少对新手或计算机jeeks@deceze Query在mysql中插入与输入表单@JW中输入的值相同的值没有错误消息@ScoRpion这是PDO@deceze Query在mysql中插入与输入表单中输入的值相同正确的SQL语法应该是
插入到值中(?,?,?)在重复密钥更新时a=a+1