gpt4 book ai didi

php - 使用 ON DUPLICATE KEY 准备好的语句

转载 作者:IT老高 更新时间:2023-10-29 00:14:13 26 4
gpt4 key购买 nike

我认为这个应该很简单,但我很难做对。我进行了一些搜索,但作为准备好的语句的新手,我无法通过查看我在此处和其他地方找到的其他示例来完全弄清楚语法。无论如何,这是我的代码。

if($stmt = $mysqli -> prepare("INSERT INTO user_info (city, state, website, public_contact, user, zipcode, pic, emailme) VALUES (?, ?, ?, ?, ?, ?, ?,?) 
ON DUPLICATE KEY UPDATE (city, state, website, public_contact, user, zipcode, pic, emailme) VALUES (?, ?, ?, ?, ?, ?, ?,?)")) {
$stmt -> bind_param("sssssssi",$city, $state, $website, $public_contact, $user, $zipcode, $pic, $emailme);
$stmt -> execute();
$stmt -> bind_result($result);
$stmt -> close();
}

用户是唯一的。这个 IMO 只是一个语法问题所以有人可以用正确的语法帮助我吗?非常感激。

ETA:只是为了帮助解决问题,当我删除 ON DUPLICATE KEY UPDATE 部分时,它确实按预期工作,但显然,它只允许每个用户一条记录并且不会更新

UPDATE:一直无法找到使用 ON DUPLICATE KEY UPDATE 的工作语法,所以我所做的(诚然可能不是最有效的方法)是事先为用户检查表格。如果用户存在,我运行并更新,如果不存在,我运行插入。下面是我的工作代码。希望这可以帮助陷入我的处境的人。

 $sql = "SELECT * FROM user_info WHERE user='$user'";

if ($result=mysqli_query($mysqli,$sql))
{
/* Return the number of rows in result set */
$rows=mysqli_num_rows($result);
/* Free result set */
mysqli_free_result($result);
}

if($rows == 0) {
if($stmt = $mysqli -> prepare("INSERT INTO user_info (city, state, website, public_contact, user, zipcode, pic, emailme) VALUES (?, ?, ?, ?, ?, ?, ?,?) ")) {

$stmt -> bind_param("sssssssi",$city, $state, $website, $public_contact, $user, $zipcode, $pic, $emailme);
$stmt -> execute();
$stmt -> bind_result($result);
$stmt -> close();
}

} else {

if($stmt = $mysqli -> prepare("UPDATE user_info SET city=?, state=?, website=?, public_contact=?, zipcode=?, pic=?, emailme=? WHERE user='$user'")) {

$stmt -> bind_param("ssssssi",$city, $state, $website, $public_contact, $zipcode, $pic, $emailme);
$stmt -> execute();
$stmt -> bind_result($result);
$stmt -> close();
}
}

最佳答案

使用 INSERT...ON DUPLICATE KEY UPDATE 的最简单方法是按以下方式使用 VALUES 子句,因此您无需在 UPDATE 子句中重复参数。他们只是对您在 VALUES 子句中传递的每一列使用相同的值:

if($stmt = $mysqli -> prepare("
INSERT INTO user_info (city, state, website, public_contact,
user, zipcode, pic, emailme)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
city = VALUES(city),
state = VALUES(state),
website = VALUES(website),
public_contact = VALUES(public_contact),
user = VALUES(user),
zipcode = VALUES(zipcode),
pic = VALUES(pic),
emailme = VALUES(emailme)") {
$stmt -> bind_param("sssssssi",$city, $state, $website, $public_contact,
$user, $zipcode, $pic, $emailme);
$stmt -> execute();
$stmt -> close();
}

IODKU 语法要求您单独设置每一列。您不能像您尝试做的那样将它们全部列在一个子句中。

您应该始终报告对 prepare() 或 execute() 的任何调用的任何错误。或者你可以让 mysqli 抛出异常:

$mysqli -> report_mode = MYSQLI_REPORT_STRICT;

此外,您不需要 bind_result(),因为没有来自 INSERT 的结果集:

// NO: $stmt -> bind_result($result);

关于php - 使用 ON DUPLICATE KEY 准备好的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22699598/

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