准备好的声明不起作用

Posted

技术标签:

【中文标题】准备好的声明不起作用【英文标题】:Prepared Statement doesn't work 【发布时间】:2015-01-11 14:48:17 【问题描述】:

所以我们有一张桌子,里面有我们所有的球员,每支球队都有一张桌子。首先,我获得了在这支球队中比赛的球员的 ID,然后我使用所说的 ID 来获取与该球员有关的所有信息。 一位朋友现在告诉我,我可以通过使用准备好的语句来减少服务器响应时间。但它不起作用!这是错误消息“致命错误:在第 63 行的“地址”中的非对象上调用成员函数 fetch_assoc()”

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) 
    die("Connection failed: " . $conn->connect_error);

$stmt = $conn->prepare("SELECT Vorname, Nachname, Bild FROM Spieler WHERE Id IN (?)");
$stmt->bind_param("i", $SpielerId);
$sql1 = "SELECT Id, SpielerId FROM 2Herren";
$list = $conn->query($sql1);
if ($list->num_rows > 0) 
    while ($rowlist = $list->fetch_assoc()) 
        $SpielerId = $rowlist["SpielerId"];
//        $sql2 = "SELECT Vorname, Nachname, Bild FROM Spieler WHERE Id IN ($SpielerId)";
//        $result = $conn->query($sql2);
        $result = $stmt->execute();
        while ($data = $result->fetch_assoc())  //Line 63
            echo "<tr><td>" . $rowlist["Id"] . "</td><td>" . $data["Vorname"] . " " . $data["Nachname"] ."</td><td><img style='max-width: 100px; max-heigth: 100px;' src='" . $data["Bild"] . "'></td></tr>";
        
    

这段代码有什么问题?

【问题讨论】:

$SpielerId 的值是多少 在获取 @Sebastian 之前尝试 print_r(result) $SpielerId的值是我要获取数据的当前玩家的id。 您可以将两个查询恢复为 1 并避免使用 SELECT h.id, h.spielerId, s.vorname, s.nachname, s.bild FROM 2Herren h JOIN Spieler s ON s.Id = h.spielerId 好吧,你可以问我。 【参考方案1】:

您正在添加此内容,并且此内容不用于准备好的语句。

$sql1 = "SELECT Id, SpielerId FROM 2Herren";
$list = $conn->query($sql1); 

您还必须执行并运行获取结果:

//Execute prepared statment
$stmt->execute();
//Get result as assoc_array
$result = $stmt->get_result();

应该是这样的:

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) 
    die("Connection failed: " . $conn->connect_error);

$stmt = $conn->prepare("SELECT Id, Vorname, Nachname, Bild FROM Spieler WHERE Id = ?");
$stmt->bind_param("i", $SpielerId);

//Execute prepared statment
$stmt->execute();
//Get result as assoc_array
$result = $stmt->get_result();
//Loop through every entry
while ($rowlist = $result->fetch_assoc()) 
    var_dump($rowlist);

准备好的语句也不会更快。它们更加安全,并且将 sql 注入的风险降至最低

【讨论】:

嗯,这是我在朋友告诉我准备好的语句之前使用的代码的一部分。我想保留它以防找不到可行的解决方案。 您从未执行过准备好的语句。此外,检查是否有任何行也没多大用处,因为如果结果为空,则 while 循环将不会运行 感谢帮助的朋友!【参考方案2】:

准备好的语句的execute 函数不会返回与查询关联的结果,而是返回一个布尔值,以确定查询是否已执行。调用$stmt-&gt;execute()后需要$stmt-&gt;get_result()得到结果

【讨论】:

以上是关于准备好的声明不起作用的主要内容,如果未能解决你的问题,请参考以下文章

JDBC 准备好的语句不起作用 [关闭]

准备好的语句的 setString 不起作用

带有准备好的语句的 PDO bindParam() 不起作用

在 PHP 中为 MATCH AGAINST 准备的语句不起作用

处理程序声明不起作用

odbc_execute 参数不起作用(空警告)