mysqli的预处理语句无法get_result()mysqli的预处理语句无法get_result

2019-05-13 21:17发布

我完全被mysqli的混淆。 虽然我一直在使用的过程MySQL调用多年来一直,我想习惯使得它提供的DB安全/ MySQL的注入保护预处理语句。 我试图写一个简单的SELECT语句(是的,我知道制作程序调用该提供性能增强)。 当运行时,我得到的所有的回声,直到我打了$result = $stmt->get_result(); 零件。 这一切似乎相当简单给我,但我在上mysqli的阅读手册小时后的损失。 任何想法为什么会失败?

*注:这是一个测试环境,而没有消毒/字符转义正在发生,我只有通过有效的内容到变量$ username和$电子邮件。 还有,我到处都找过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的程序。 是的,我知道这是一个范围的问题,并没有我一直无法理解这一类变量的作用域。 当我宣布它的功能之外,当我走进了它的功能不可用。

UPDATE如果我更改线路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驾驶员所在。 也许有一个办法简单地测试呢? 虽然他们通常给了我在过去的很懂行的答案。

UPDATE ......还是那句话:我检查了我的服务器功能自己和发现,在库MySQLi和PDO都存在,mysqlnd不是。 正是如此,我明白了为什么get_result()将无法正常工作(mysqlnd需要我认为),我还是不明白,为什么事先准备好的声明本身将无法正常工作。

Answer 1:

经过一番检查,即使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);
}


Answer 2:

请告诉我你的PHP版本? 您应该检查这一点:

有什么不对的mysqli :: get_result?

似乎是一个A-一点位太跟上时代的东西。



Answer 3:

mysqli_stmt :: get_result仅适用于mysqlnd包。 删除的php5-mysql软件包和安装PHP5,mysqlnd代替



文章来源: mySQLi prepared statement unable to get_result()