【问题标题】:`SELECT` Query not working for prepared statement`SELECT`查询不适用于准备好的语句
【发布时间】:2020-06-23 14:44:46
【问题描述】:

我试图在我的数据库的用户列中显示所有用户,但没有显示任何内容。我想根据他们获得的喜欢的数量对用户进行排名。我的查询对我来说看起来不错,但它没有显示任何内容。没有警告、错误或我要求的输出。有人可以告诉我我做错了什么吗?我已经检查了大约一个小时的所有答案,然后我尝试使用我已经拥有的准备好的语句。但没有任何效果。

这是整个页面:

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
error_reporting(-1);

require 'includes/header.php';

$stmt = $con->prepare('SELECT username, num_likes FROM users WHERE username = ? ORDER BY num_likes DESC ');
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($username, $num_likes);

// output data of each row
while ($stmt -> fetch()) {
    
    echo '<div id="rcorners2">';
            
    echo '<p id="p2">' . $username . '</p>';

    echo '<p id="p4">' . $num_likes . '</p>';   
    
    echo'</div>';
    echo'</br>';

}

?>

<!DOCTYPE html>
<html>
<head>
<title>User's Ranks</title>
<style type="text/css">
    
#rcorners2 {
    border-radius: 5px;
    border: 2px solid #8c8c8c;
    padding: 20px;
    width: 500px;
    word-wrap: break-word;
    height: 200px;
    overflow-x: hidden;
    margin-left: 350px;
}
#p2 {
    float:left;
    color: #000000;
    margin-top: -10;
    font-size: 20px;
}
#p4 {
    float:left;
    color: #000000;
    margin-top: -1%;
    font-size: 20px;
}
</style>
</head>
<body>

</body>
</html>

【问题讨论】:

  • 该查询最多只能选择一个用户。或者如果您传递给查询的用户名不存在,则不存在
  • 您还在输出 HTML &lt;!DOCTYPE html&gt; 和 HTML 文档的其他基本部分之前输出查询结果。因此,即使您获取任何行,它们也不会出现在文档中
  • @RiggsFolly 我在脚本顶部声明了用户名变量,但它仍然不起作用。如果我这样做,它是否安全?它完全按照我想要的方式工作,并且不会显示错误
  • $stmt = $con->prepare('SELECT username, num_likes FROM users ORDER BY num_likes DESC '); //$stmt->bind_param('s', $username); $stmt->执行(); $stmt->store_result(); $stmt->bind_result($username, $num_likes);

标签: php mysql mysqli prepared-statement


【解决方案1】:

您还在输出 HTML &lt;!DOCTYPE html&gt; 和 HTML 文档的其他基本部分之前输出查询结果。因此,即使您得到任何行,它们也不会出现在文档中

如果您在文档&lt;body&gt; 中输出您的信息,它将显示在页面上

<!DOCTYPE html>
<html>
<head>
<title>User's Ranks</title>
<style type="text/css">
    
#rcorners2 {
    border-radius: 5px;
    border: 2px solid #8c8c8c;
    padding: 20px;
    width: 500px;
    word-wrap: break-word;
    height: 200px;
    overflow-x: hidden;
    margin-left: 350px;
}
#p2 {
    float:left;
    color: #000000;
    margin-top: -10;
    font-size: 20px;
}
#p4 {
    float:left;
    color: #000000;
    margin-top: -1%;
    font-size: 20px;
}
</style>
</head>
<body>
<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
error_reporting(-1);
require 'includes/header.php';

$stmt = $con->prepare('SELECT username, num_likes 
                        FROM users WHERE username = ? 
                        ORDER BY num_likes DESC ');
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($username, $num_likes);

// output data of each row
while ($stmt -> fetch()) {
    echo '<div id="rcorners2">';
    echo '<p id="p2">' . $username . '</p>';
    echo '<p id="p4">' . $num_likes . '</p>';   
    echo'</div>';
    echo'</br>';
}
?>
</body>
</html>

您还说您希望所有用户都付款,因此查询可能还需要更改以获取所有用户,而您的用户只能获得一个。

$result = $con->query('SELECT username, num_likes 
                        FROM users
                        ORDER BY num_likes DESC ');

// output data of each row
while ($row = $result->fetch_assoc()) {
    echo '<div id="rcorners2">';
        echo '<p id="p2">' . $row['username'] . '</p>';
        echo '<p id="p4">' . $row['num_likes'] . '</p>';   
    echo'</div>';
    echo'</br>';

【讨论】:

  • 添加了一些代码来更改查询以获取所有用户
  • 这样安全吗?
  • 是的,您没有在查询中使用任何连接值,因此您没有用于 SQL 注入的向量
【解决方案2】:

你需要先初始化一个数据库连接。

例如$mysqli = new mysqli("localhost","my_user","my_password","my_db"); 参考:https://www.w3schools.com/php/func_mysqli_connect.asp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多