作者:络风落泪_411 | 来源:互联网 | 2022-11-14 21:46
我有这两个功能.$ stmt查询在我的dbase中插入数据两次,即使使用检查例程也是如此.
一直试图抓住错误,但我找不到它.
常规的MySQLi例程以完全相同的方式调用,确实只插入一次数据.
我无法绕过原因.做了一些回声检查,echo'ed SQL insert etcetera.我只是不知道发生了什么.我还没有使用$ stmt,但是想要更好地利用程序员的生活.这没有帮助:-)
在XAMPP上运行测试:Apache/2.4.29(Win32)OpenSSL/1.1.0g PHP/7.2.1 Clientversie van数据库:libmysql - mysqlnd 5.0.12-dev - 20150407 PHP-versie:7.2.1
此代码插入两次:
$result = mysql_insert_array_serialised($conn, $dbt_serialsets, $_POST, $addon);
function mysql_insert_array_serialised($conn, $table, $data, $addon = "mc_api") {
$random_code = substr(str_shuffle(MD5(microtime())), 0, 12);
$settings = serialize($data);
$uid = $_SESSION['uid'];
$sql_chk = "SELECT sn FROM $table WHERE sn = ?";
if ($stmt = $conn->prepare($sql_chk)) {
$stmt->bind_param('s', $random_code);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows == 0) {
// SN doesnt already exist
$sql_insert = 'INSERT INTO ' . $table . ' (uid, addon, sn, settings) VALUES (?, ?, ?, ?)';
if ($stmt = $conn->prepare($sql_insert)) {
$stmt->bind_param('ssss', $uid, $addon, $random_code, $settings);
$stmt->execute();
if (!$stmt->execute()) {
echo $stmt->error;
}else{
return array(
"mysqli_error" => false,
"sn" => $random_code
);
}
} else {
echo 'Could not prepare statement!';
}
}
}
}
虽然这个具有完全相同的数据,但应该完成工作.一个插页.
$result = mysql_insert_array($conn, $dbt_serialsets, $_POST, $addon);
function mysql_insert_array($conn, $table, $data, $addon) {
$random_code = substr(str_shuffle(MD5(microtime())), 0, 12);
$settings = serialize($data);
$uid = $_SESSION['uid'];
if ($conn->query("INSERT INTO $table (uid, addon, sn, settings) VALUES ('" . $uid . "', '" . $addon . "' , '" . $random_code . "', '" . $settings . "')")) {
return array(
"mysqli_error" => false,
"mysqli_insert_id" => $conn->insert_id,
"mysqli_affected_rows" => $conn->affected_rows,
"mysqli_info" => $conn->info,
"sn" => $random_code
);
} else {
return array("mysqli_error" => $conn->error);
}
}
我很困惑.关于类似问题的回复很少,有人说一旦上传到http服务器就解决了,我只在我的本地测试XAMPP上运行它
由于你们中的一些人认为双$ stmt->执行是问题,但事实并非如此.一个用于选择(检查exisitng),一个用于插入新数据.
原来的功能是这样的,改回来并仍然插入两次:
function mysql_insert_array_serialised_test($conn, $table, $data, $addon = "mc_api") {
$random_code = substr(str_shuffle(MD5(microtime())), 0, 12);
$settings = serialize($data);
$uid = $_SESSION['uid'];
$sql_insert = 'INSERT INTO ' . $table . ' (uid, addon, sn, settings) VALUES (?, ?, ?, ?)';
if ($stmt = $conn->prepare($sql_insert)) {
$stmt->bind_param('ssss', $uid, $addon, $random_code, $settings);
$stmt->execute();
if (!$stmt->execute()) {
echo $stmt->error;
} else {
return array(
"mysqli_error" => false,
"sn" => $random_code
);
}
} else {
echo 'Could not prepare statement!';
}
}
显然,我读得不好.我很抱歉.帖子中提到的双重执行是存在的,删除1确实有帮助.我以为一个用于检查是否有有效结果,而不是实际再次执行查询.
去耻辱的角落*
Nick..
5
你有两个调用$stmt->execute()
这两个调用将执行INSERT
:
$stmt->execute();
if (!$stmt->execute()) {
你可以删除第一个.
1> Nick..:
你有两个调用$stmt->execute()
这两个调用将执行INSERT
:
$stmt->execute();
if (!$stmt->execute()) {
你可以删除第一个.