我正在尝试使用mysqli函数将一些数据插入到表中。
使用以下方法可以正常连接:
function connectDB(){
// configuration
$dbuser = "root";
$dbpass = "";
// Create connection
$con=mysqli_connect("localhost",$dbuser,$dbpass,"my_db");
// Check connection
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
return false;
}else{
echo '<br />successfully connected<br />';
return $con;
}
}
但是当我尝试运行我的插入函数时,我在数据库中什么也得不到。
function newUserInsertDB($name,$email,$password){
$con = connectDB();
// Prepare password
$password = hashEncrypt($password);
echo $password . "<br />";
// Perform queries
mysqli_query($con,"SELECT * FROM users");
mysqli_query($con,"INSERT INTO users (name,email,password,isActivated) VALUES ($name,$email,$password,0)");
// insert
mysqli_close($con);
}
我一直在查看mysqli函数列表以找出错误的正确方法,但它们似乎都与DB的连接有关,而不是关于插入的成功(我可以在我的DB中清楚地看到它没有插入。)
最好的调试方法是什么?我的插入物应该使用哪种错误处理?
我尝试使用mysqli_sqlstate,它给出了42000
的响应,但我在语句中看不到任何语法错误。
答案 0 :(得分:2)
正如我的评论中提到的,你最好使用准备好的声明。例如......
$stmt = $con->prepare(
'INSERT INTO users (name, email, password, isActivated) VALUES (?, ?, ?, 0)');
$stmt->bind_param('sss', $name, $email, $password);
$stmt->execute();
使用它,您不必担心转义值或为字符串类型提供引号。
总而言之,预处理语句比尝试将值插入SQL字符串更容易,也更安全。
我还建议您将$con
变量传递给您的函数,而不是在其中创建它。例如......
function newUserInsertDB(mysqli $con, $name, $email, $password) {
// Prepare password
$password = hashEncrypt($password);
// functions that "echo" can cause unwanted side effects
//echo $password . "<br />";
// Perform queries
$stmt = $con->prepare(
'INSERT INTO users (name, email, password, isActivated) VALUES (?, ?, ?, 0)');
$stmt->bind_param('sss', $name, $email, $password);
return $stmt->execute(); // returns TRUE or FALSE based on the success of the query
}
答案 1 :(得分:1)
来自值周围的mysql语句中缺少引号。此外,您应该在将值插入查询之前转义它们。这样做:
mysqli_query($con,"INSERT INTO users (name,email,password,isActivated) VALUES ('".
mysqli_real_escape_string($con,$name)."','".
mysqli_real_escape_string($con,$email)."','".
mysqli_real_escape_string($con,$password)."',0)");
此致