Php mySQLi prepared语句无法获取_result()

Php mySQLi prepared语句无法获取_result(),php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我完全被mySQLi搞糊涂了。尽管多年来我一直在使用程序性mysql调用,但我想习惯于为它提供的db security/mysql注入保护编写语句。我正在尝试编写一个简单的select语句(是的,我知道为此进行过程调用可以提高性能)。运行时,我会得到所有的回音,直到我点击$result=$stmt->get_result()组件。这一切对我来说似乎相当简单,但在读了几个小时关于mySQLi的手册后,我不知所措。你知道为什么这会失败吗 *注意:这是一个测试环境,虽然没有对字符进行清理/转义,但我只

我完全被mySQLi搞糊涂了。尽管多年来我一直在使用程序性mysql调用,但我想习惯于为它提供的db security/mysql注入保护编写语句。我正在尝试编写一个简单的select语句(是的,我知道为此进行过程调用可以提高性能)。运行时,我会得到所有的回音,直到我点击
$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是受支持的,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);
}
尽可能多的错误检查,我能想到的,并没有任何问题,在第一次破解它

最终代码


mysqli_stmt::get_result仅适用于mysqlnd软件包。删除php5 mysql包并安装php5 mysqlnd,而不是安装php5 mysqlnd

我自己使用PDO,但也有例外(并且可以明确推荐它…),因此我对mysqli了解不多,但您似乎可以使用
$stmt->error
获得错误描述,请参阅。这给了你什么?我对PDO完全不熟悉,它是否提供了与mysqli准备的语句相同的好处?我将立即检查$stmt->error函数。此外,即使存在my provider clains mysqlnd,运行phpinfo()也不会显示对它的任何引用…启用错误报告、显示/记录并告诉我们您收到的错误消息。有了这些信息,告诉你这里发生了什么是很容易的。其他的一切都是在暗中摸索和假设。这花费了你的精力和时间。就像我说的,我对mysqli一无所知。事实上,在尝试这条路线之前,我可能会对mysqli做更多的研究。查看了PDO(甚至不知道它可以与mysqli相比),它有很多好处。轻微的性能打击,但所有的事情都一样,命名参数和直接到对象的结果是难以置信的!更不用说数据库抽象了。查看更多信息,将很快更新…PDO没有问题!最终代码如下,无法回答我自己的问题,因为声誉还不够高<代码>函数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,其中username=:username或email=:email');$sth->execute($params);$result=$sth->fetch(PDO::fetch_ASSOC);print_r($result);}
您如何做到这一点?
    $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';
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);
}