无法从数据库获取单个字段

时间:2020-03-12 23:00:49

标签: php mysql

当我尝试执行此操作时,它将获取整个列,而不仅仅是一个字段。

$connection = mysqli_query($db, "SELECT * FROM users");




<?php
while($row = mysqli_fetch_array($connection)) {
?>
<p>Your balance is: <?php echo $row['balance']; ?></p>
<?php
}
?>

那是输出 您的余额为:5 您的余额为:0 您的余额为:

所以我尝试了

$query_for_selecting = mysqli_query($db, "SELECT balance FROM users");


<?php if (mysqli_num_rows($query_for_selecting) > 0) { ?>
<?php while($row = mysqli_fetch_assoc($query_for_selecting)) { ?>
<p>Your balance is <?php $row['balance']; ?></p>
<?php } ?>
<?php }  ?>

那并没有输出任何东西,所以最终,我尝试使用WHERE子句,限制为1

$query_for_selecting = mysqli_query($db, "SELECT * FROM users WHERE balance = '3' DESC LIMIT 1");
<?php if (mysqli_num_rows($query_for_selecting) > 0) { ?>
<?php while($row = mysqli_fetch_assoc($query_for_selecting)) { ?>
<p>Your balance is <?php $row['balance']; ?></p>
<?php } ?>
<?php }  ?>

我只有一个白屏

2 个答案:

答案 0 :(得分:2)

我对正在发生的事情有一种感觉。假设您在某处有唯一的ID,那么您将在不使用LIMIT 1和/或使用WHERE子句的情况下获取整个数据库。我确定您的数据库表中有不止一条记录。

我打算在评论中发布此内容,但决定不发布。 Stack真的不希望我们这样做( edit ),此时,发表评论的时间太长了。

@ADyson“最初,我想显示已登录用户的余额,但无法解决。” – markthedark

关于。似乎您正在寻找的是特别是要获得用户/记录的余额。为此,您肯定需要使用WHERE子句。

如果查询失败,请启用错误报告并检查查询中的错误。

参考:

此外,$i = 0;$i++;可能无济于事。很难说应该做什么。我知道语法,只是不知道为什么要增加它。

旁注:我将避免使用$connection作为查询变量分配。这可能会令人困惑。尝试使用诸如$query_for_selecting之类的明确名称。

答案 1 :(得分:2)

我认为这里可能有一个基本的小教程。

首先,SELECT * FROM users的意思是:“给我users表中的所有内容”。您将获得完整的表格,每一行和每一列。

while($row = mysqli_fetch_array($connection))将遍历查询返回的每一行。它将调用mysqli_fetch_array()并将结果放入$row中,直到查询结果中没有更多行。

如果只想输出一行数据,则有三个选择:

  • 添加一个WHERE条件,以便您的查询仅获取特定的行
  • 添加一个LIMIT子句,以便您的查询仅获取单行
  • 仅调用一次mysqli_fetch_array(),而不是while循环

从讨论主题中的注释中,您似乎想只为当前登录的用户检索{em> balance,并且在某处有一个会话变量可以告诉您该用户是。这意味着您将要使用WHERE条件,以便您的查询仅获取该特定用户的行。

您尚未告诉我们会话变量的名称或users表中与该会话变量进行比较的列的名称,因此我假设您的{{1 }}表中有一个users列,您的会话变量称为id,应与您的user_id表中的id值匹配。

因此,假设users 123的用户当前已登录。您将以查询id结尾。

快速的解决方案是将代码更改为:

SELECT balance FROM users WHERE id = 123

这是错误的代码。我们会做的更好,但是请先尝试一下,看看它是否能为您带来实际想要的结果。如果没有,请告诉我。

原因 这是错误的代码,因为这样向查询字符串中添加变量会大大增加SQL注入的风险。如果该变量的值完全有可能来自用户输入,则在某个时候,用户 会弄清楚这一点,并确保它包含会破坏您的应用程序的内容。

  • 最佳情况:该页面根本不会为该用户呈现。
  • 糟糕的情况:用户将能够读出您的整个数据库,并将敏感的用户数据出售给出价最高的人。
  • 最坏的情况:在呈现之前,用户将能够在您未消毒的列中向数据库注入自己的一些Javascript代码,从而使他们能够捕获和拦截用户输入的密码和/或财务信息您的网站,他们将使用这些信息使所有用户的生活痛苦不堪。

因此,您不想像这样将$connection = mysqli_query($db, "SELECT balance FROM users WHERE id = " . $_SESSION['user_id']);放入查询中。相反,您将要使用准备好的语句,并让数据库处理将变量放入查询的问题。

首先,您需要$_SESSION['user_id']查询:

prepare

$statement = mysqli_prepare($db, "SELECT balance FROM users WHERE id = ?"); 符号是一个占位符,您可以在其中?一个参数。让我们做到这一点:

bind

$statement->bind_param("i", $_SESSION['user_id']); 告诉MySQL您正在绑定一个整数值。例如,如果您不匹配用户"i"而是用户名,则想使用id告诉MySQL您要绑定 string

现在,您可以"s"查询并获取结果。全部放在一起:

execute

让我们知道是否可行。可能需要一些调整。

相关问题