gpt4 book ai didi

php - mySQLi 准备好的语句无法获取结果()

转载 作者:可可西里 更新时间:2023-11-01 12:30:59 26 4
gpt4 key购买 nike

我完全被 mySQLi 弄糊涂了。尽管多年来我一直在使用程序化 mysql 调用,但我想习惯于为它提供的数据库安全/mySQL 注入(inject)保护制作准备好的语句。我正在尝试编写一个简单的选择语句(是的,我知道为此进行程序调用可以提高性能)。运行时,我得到所有 echo ,直到我点击 $result = $stmt->get_result(); 组件。对我来说,这一切似乎都相当简单,但在阅读了 mySQLi 手册数小时后,我还是不知所措。知道为什么会失败吗?

*注意:这是一个测试环境,虽然没有对字符进行清理/转义,但我只是将有效内容传递给变量 $username 和 $email。而且,我已经四处寻找 SO 以找到解决我的问题的方法。

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 中那样持久的数据库连接。是的,我知道这是一个范围问题,不,我无法理解此类变量的范围。当我在函数外声明它时,当我进入函数时它不可用。

更新如果我将第 12 行更改为:

if($stmt = $mysqli -> prepare("SELECT username,email FROM tb_users WHERE username=? OR email=?")) {

到:

    $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';

我收到声明未准备好。现在我更糊涂了....

更新: 我联系了我的托管服务提供商,显然支持 mySQLi,并且存在 mysqlnd 驱动程序。也许有一种方法可以简单地测试这个?尽管过去他们通常会给我非常有见识的答案。

更新...再次: 我自己检查了我的服务器功能并发现,虽然 mysqli 和 PDO 存在,但 mysqlnd 不存在。因此,我明白为什么 get_result() 不起作用(我认为需要 mysqlnd),我仍然不明白为什么准备好的语句本身不起作用。

最佳答案

通过一些检查,即使我的主机上安装了 mysqli,显然 mysqlnd 驱动程序不存在。因此,不能使用 get_result()(php 手册将 get_result 定义为依赖于 mysqlnd),而是需要进行额外的编码以按照我希望的方式处理我的结果。

因此,我决定尝试了解 PDO 的工作原理,几分钟之内,瞧!!!

将上面的代码替换为:

function checkUsernameEmailAvailability($username, $email) {

echo 'pdo about to be created';

$dsn = 'mysql:dbname='.C_BASE.';host='.C_HOST;
$user = C_USER;
$password = C_PASS;

try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}

$params = array(':username' => $username, ':email' => $email);

try{
$sth = $dbh->prepare('SELECT username,email FROM tb_users WHERE username = :username OR email = :email ');
} catch(PDOException $e) {
echo 'Prepare failed: ' . $e->getMessage();
}

try{
$sth->execute($params);
} catch(PDOException $e) {
echo 'Execute failed: ' . $e->getMessage();
}
$result = $sth->fetch(PDO::FETCH_ASSOC);
print_r($result);
}

尽可能多的错误检查,首先破解它没有任何问题!

最终代码

function checkUsernameEmailAvailability($username, $email) {
$dsn = 'mysql:dbname='.C_BASE.';host='.C_HOST;
$user = C_USER;
$password = C_PASS;
new PDO($dsn, $user, $password);

$params = array(':username' => $username, ':email' => $email);

$sth = $dbh->prepare('SELECT username,email FROM tb_users WHERE username = :username OR email = :email ');
$sth->execute($params);
$result = $sth->fetch(PDO::FETCH_ASSOC);

print_r($result);
}

关于php - mySQLi 准备好的语句无法获取结果(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10466530/

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