我对 mySQLi 完全困惑了。尽管我多年来一直使用过程式 mysql 调用,但我想习惯于为其提供的数据库安全/mySQL 注入保护编写准备好的语句。我正在尝试编写一个简单的选择语句(是的,我知道为此进行过程调用可以增强性能)。跑步时,我得到所有的回声,直到我击中$result = $stmt->get_result();
成分。这一切对我来说似乎相当简单,但在阅读了几个小时的 mySQLi 手册后我却不知所措。有什么想法为什么会失败吗?
*注意:这是一个测试环境,虽然没有进行字符清理/转义,但我仅将有效内容传递到变量 $username 和 $email 中。而且,我已经四处寻找以找到我的问题的解决方案。
function checkUsernameEmailAvailability($username, $email) {
//Instantiate mysqli connection
@$mysqli = new mysqli(C_HOST,C_USER,C_PASS,C_BASE) or die("Failed to connect to MySQL database...");
if (!$mysqli)
{
echo 'Error: Could not connect to database. Please try again later...';
exit;
} else {
echo 'mysqli created';
}
/* Create a prepared statement */
if($stmt = $mysqli -> prepare("SELECT username,email FROM tb_users WHERE username=? OR email=?")) {
echo '<br />MYSQLi: ';
/* Bind parameters s - string, b - boolean, i - int, etc */
$stmt -> bind_param("ss", $username, $email);
echo '<br />paramsBound...';
/* Execute it */
$stmt -> execute();
echo '<br />Executed';
$result = $stmt->get_result();
echo '<br />Result acquired';
/* now you can fetch the results into an array - NICE */
$myrow = $result->fetch_assoc();
echo '<br />Fetched';
/* Close statement */
/$stmt -> close();
echo '<br />Done mysqli';
}
}
另外,每次调用函数时都必须实例化 mysqli 吗?我假设它们不是像程序 mysql 那样的持久数据库连接。是的,我知道这是一个范围问题,不,我无法理解此类变量的范围。当我在函数外部声明它时,当我进入函数时它不可用。
UPDATE如果我将第 12 行更改为:
if($stmt = $mysqli -> prepare("SELECT username,email FROM tb_users WHERE username=? OR email=?")) {
to:
$stmt = $mysqli->stmt_init();
if($stmt = $mysqli -> prepare("SELECT username,email FROM tb_users WHERE username=? OR email=?")) {
if(!stmt) echo 'Statement prepared'; else echo 'Statement NOT prepared';
我收到声明未准备好。现在我更迷茫了......
UPDATE: