使用已准备语句的php更新查询不起作用
我正在使用以下准备好的语句更新表,如下所示:使用已准备语句的php更新查询不起作用,php,mysql,Php,Mysql,我正在使用以下准备好的语句更新表,如下所示: $query = " UPDATE signup SET name=?,password=?,verify_key=? WHERE email=? "; $stmt=$conn->prepare($query); $stmt->bind_param("ssss",$dname,$password,$verify_key,$email); $stmt->execute(); $stmt->close(); 但它给了我
$query = " UPDATE signup SET name=?,password=?,verify_key=? WHERE email=? ";
$stmt=$conn->prepare($query);
$stmt->bind_param("ssss",$dname,$password,$verify_key,$email);
$stmt->execute();
$stmt->close();
但它给了我一个长期困扰的错误:
致命错误:在第75行的somefile.php中对布尔值调用成员函数bind_param()
数据库中表的结构如下:
mysql> desc signup;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| sid | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | | NULL | |
| email | varchar(100) | NO | UNI | NULL | |
| password | varchar(255) | NO | | NULL | |
| verify_key | varchar(255) | NO | | NULL | |
| active | bit(1) | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
注意:我打印了$dname、$password、$verify\u key、$email。所有打印的字符串值都正确
整个PHP代码:
<?php
session_start();
ob_start();
require_once("connection.php");
$dname=$_POST['dname'];
$email=$_POST['email'];
$password=$_POST['password'];
if(empty($dname) || empty($email) || empty($password))
die("Enter correct details.");
$password = password_hash($password,PASSWORD_DEFAULT); // generate hash for password
$verify_key = password_hash(RandomString(),PASSWORD_DEFAULT); // generate hash for verification key
/* RandomString() generates random string */
function RandomString($length = 32) {
$randstr;
//our array add all letters and numbers if you wish
$chars = array(
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
for ($rand = 0; $rand <= $length; $rand++) {
$random = rand(0, count($chars) - 1);
$randstr .= $chars[$random];
}
return $randstr;
} // function RandomString() over
/* Mail Sending Code */
function sendMail($email,$verify_key){
$to = $email;
$subject = 'Something';
$mail_link='https://127.0.0.1/rs/signupCheck.php?email='.$email.'&key='.$verify_key;
$message = "
<html>
<head>
<title></title>
</head>
<body>
<p>
<a href='> Click this link to verify your account </a>
</p>
</body>
</html>
";
// To send HTML mail, the Content-type header must be set
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=iso-8859-1';
$headers[] = 'From: Something <Something>';
$res = mail($to, $subject, $message, implode("\r\n", $headers));
return $res; //check officially mail is sent or not
} // function sendMain() ends
// check if email already exists in database
$query = " SELECT active FROM signup WHERE email=?";
$stmt = $conn->prepare($query);
$stmt->bind_param("s",$email);
$stmt->execute();
$stmt->bind_result($dbactive);
if($stmt->fetch()){ // email is present in DB
if($dbactive==1){ // status=1
$stmt->close();
die("Account already created. Try forget passwod if you can't access it.");
}
else{
/* Record is already present with status=0 , override all the details */
if(sendMail($email,$verify_key)) { // send mail first then update DB
$query = " UPDATE `signup` SET `name`=?,`password`=?,`verify_key`=? WHERE `email`=? ";
$stmt=$conn->prepare($query);
$stmt->bind_param("ssss",$dname,$password,$verify_key,$email);
$stmt->execute();
$stmt->close();
die("We sent you verification link on mail. Click it to verify !!!");
}
else {
die("Mail sending failed. Try again !!!");
}
}
} // email already present with either status=1 or status=0
else { // Insert account details in DB , nothing is present in DB for user
if(sendMail($email,$verify_key)) { // send mail first then update DB
$query = "INSERT INTO signup (sid,name,email,password,verify_key,active)VALUES(?,?,?,?,?,?)";
$stmt = $conn->prepare($query);
$stmt->bind_param("issssi",$fixed_sid='',$dname,$email,$password,$verify_key,$fixed_active=0);
/* Notice $fixed_sid and $fixed_active , it is needed
you can't have fixed values in bind_param
*/
$stmt->execute();
$stmt->close();
die("We sent you verification link on mail. Click it to verify !!!");
}
else {
die("Mail sending failed. Try again !!!");
}
} // first time data entry in DB
?>
添加$stmt->close()代码>在下一次mysqli
交互之前
if(sendMail($email,$verify_key)) { // send mail first then update DB
$stmt->close();
$query = " UPDATE `signup` SET `name`=?,`password`=?,`verify_key`=? WHERE `email`=? ";
或者,您可能总是希望在完成之前的mysql
交互后执行close
if(sendMail($email,$verify_key)) { // send mail first then update DB
$stmt->close();
$query = " UPDATE `signup` SET `name`=?,`password`=?,`verify_key`=? WHERE `email`=? ";
e、 g:
并删除$stmt->close()如果
,则从中选择code>。我从未见过关于这方面的官方文档,但我见过其他线程,这是一个潜在的问题。手册页本身几乎说明了相反的情况:
因此,虽然显式关闭打开的连接并释放结果集是可选的,但建议这样做
是可选的是错误的(…以我的经验,我也主要使用PDO)。添加$stmt->close()代码>在下一次mysqli
交互之前
if(sendMail($email,$verify_key)) { // send mail first then update DB
$stmt->close();
$query = " UPDATE `signup` SET `name`=?,`password`=?,`verify_key`=? WHERE `email`=? ";
或者,您可能总是希望在完成之前的mysql
交互后执行close
if(sendMail($email,$verify_key)) { // send mail first then update DB
$stmt->close();
$query = " UPDATE `signup` SET `name`=?,`password`=?,`verify_key`=? WHERE `email`=? ";
e、 g:
并删除$stmt->close()如果
,则从中选择code>。我从未见过关于这方面的官方文档,但我见过其他线程,这是一个潜在的问题。手册页本身几乎说明了相反的情况:
因此,虽然显式关闭打开的连接并释放结果集是可选的,但建议这样做
是可选的
是错误的(…根据我的经验,我也主要使用PDO)。我的查询中有一个问题,这行代码帮助我诊断错误
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
这里有参考资料,可能对你有帮助
我的查询中有一个问题,这行代码帮助我诊断错误
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
这里有参考资料,可能对你有帮助
您准备的声明返回值为false。。可能是你的列名不对。。检查错误。。您需要通过引用传递变量。@cybermonkey的问题在于prepare
而不是bind\u param
@u\u mulder我知道,不管怎样,变量仍然需要通过引用传递。查询的格式也应该正确,以防止MySQLi将表/列名解释为保留字。您在这里看到了什么保留字?您准备的语句返回false。。可能是你的列名不对。。检查错误。。您需要通过引用传递变量。@cybermonkey的问题在于prepare
而不是bind\u param
@u\u mulder我知道,不管怎样,变量仍然需要通过引用传递。查询也应该正确格式化,以防止MySQLi将表/列名解释为保留字。您在这里看到了什么保留字?