准备好的声明不起作用
Prepared Statement doesn't work
所以我们有一个 table 所有球员和一个 table 每个团队。首先,我得到了在这支球队打球的球员的 ID,然后我使用所说的 Id 来获取关于这个球员的所有信息。
一位朋友现在告诉我,我可以通过使用准备好的语句来减少服务器响应时间。但它不起作用!这是第 63 行的错误消息 "Fatal error: Call to a member function fetch_assoc() on a non-object in "address"
$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>";
}
}
}
这段代码有什么问题?
您正在添加这个,它不用于准备好的语句。
$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 注入
的风险降至最低
准备语句的execute
函数不会return与查询关联的结果,而是一个布尔值,以确定是否执行了查询。您需要在调用 $stmt->execute()
后使用 $stmt->get_result()
获取结果
所以我们有一个 table 所有球员和一个 table 每个团队。首先,我得到了在这支球队打球的球员的 ID,然后我使用所说的 Id 来获取关于这个球员的所有信息。 一位朋友现在告诉我,我可以通过使用准备好的语句来减少服务器响应时间。但它不起作用!这是第 63 行的错误消息 "Fatal error: Call to a member function fetch_assoc() on a non-object in "address"
$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>";
}
}
}
这段代码有什么问题?
您正在添加这个,它不用于准备好的语句。
$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 注入
的风险降至最低准备语句的execute
函数不会return与查询关联的结果,而是一个布尔值,以确定是否执行了查询。您需要在调用 $stmt->execute()
$stmt->get_result()
获取结果