准备好的陈述......我做错了什么?

时间:2014-03-15 02:00:53

标签: php mysqli

我正在尝试更新一些代码并同时更新我的​​编码技巧。在查看几个网站上的预备陈述后,我尝试将其转换为准备好的声明:

$db=new Database();
$query='SELECT * FROM `student` WHERE `student_id`="'.$student_id.'" LIMIT 1';
$result=$db->query($query)or die('...');
$row=$result->fetch_assoc();

作为一个“简单”的第一步,我尝试使用一个没有任何变量的准备语句,因为我似乎无可救药地陷入了初级阶段:

    $db = new mysqli("localhost", "uname", "pword", "astro8_gakkou");
    if(!($stmt=$db->prepare("SELECT * FROM `student` WHERE `student_id`=5 LIMIT 1"))){
        echo "Prepare failed: (".$db->errno.") ".$db->error;
    }
    if(!$stmt->execute()){
        echo "Execute failed: (".$db->errno.") ".$db->error;
    }
    $result=$stmt->get_result();
    $row=$result->fetch_assoc();

这会在它的轨道上杀死php。这是罪魁祸首的最后一行,但我无法理解为什么。我知道我只是愚蠢,但有人能指出我错过的基本概念吗?我通过php.net和其他许多网站一起阅读,我似乎无法看到我错过了哪一步。

更新:仍然无法正常工作,但我已更新了代码。日志现在显示此错误:

  

[2014年3月14日22:34:10 America / New_York] PHP致命错误:致电   未定义的方法mysqli_stmt :: get_result()in   第38行的/webdocs/zinc/class.Student.inc

2 个答案:

答案 0 :(得分:0)

看起来你错过了一个    $result = $stmt->get_result();

然后拉出结果    $row = $result->fetch_assoc();

在此处查看第一个用户提供的注释:http://www.php.net/manual/en/mysqli.prepare.php

答案 1 :(得分:0)

尽管我另有说法,答案是使用PDO。这是最简单的形式:

$db=new Database();
$query='SELECT * FROM `student` WHERE `student_id`="'.$student_id.'" LIMIT 1';
$result=$db->query($query)or die('...');
$row=$result->fetch_assoc();

成为这个(使用PDO和准备好的陈述):

$db=new PDO("mysql:dbname=school;host=localhost","root","root");
$stmt=$db->prepare("SELECT * FROM `student` WHERE `student_id`= ? LIMIT 1");
$stmt->bindParam(1,$student_id);
$stmt->execute();
$row=$stmt->fetch();

非常感谢给那些推动我(大喊大叫)使用PDO的人们。这非常有效,不会产生任何错误。这意味着更新代码需要更多工作,但我认为从长远来看它是值得的。