mySQLi准备好的语句无法获取

我完全被mySQLi搞糊涂了。 虽然我多年来一直在使用过程式mysql调用,但我想习惯为它提供的db安全/ 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? 我假设他们不是持久数据库连接像过程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 :: get_result有什么问题?

看起来像是一点点过时的事情。


mysqli_stmt :: get_result仅适用于mysqlnd包。 删除php5-mysql包,然后安装php5-mysqlnd

链接地址: http://www.djcxy.com/p/44879.html

上一篇: mySQLi prepared statement unable to get

下一篇: Need some explanation about prepared statements in PHP