MySQL 查询未获取结果 (PHP)


MySQL query not fetching results (PHP)

我有以下脚本,其中包含无法正常工作的SQL问题。

    <?php
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "Freepaste";
$conn = mysqli_connect($servername, $username, $password,$dbname);
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
$user = $_POST['user'];
$pass = $_POST['pass'];
echo $user."  ".$pass;
$stmt = $conn->prepare("SELECT * FROM users where users.username= ? AND users.password = ?");
$stmt->bind_param('ss', $user, $pass);
$stmt->execute();
$result = $stmt->get_result();
printf("Errormessage: %s'n", $mysqli->error);;
if (mysqli_num_rows($result) > 0) {
    // output data of each row
    while($row = mysqli_fetch_assoc($result)) {
        echo "<br>id: " . $row["username"]." Password ".$row["password"]. "<br>";
    }
} 
else {
    echo "<br>0 results <br>";
    printf("Errormessage: %s'n", $mysqli->error);
}
mysqli_close($conn);
?>

没有"where"子句的语句会得到所有的结果,所以我知道键是正确的。另外,我在MySQL中运行了查询,它工作正常。我尝试将"添加到$user$pass,但仍然不起作用。我检查了HTML中的名称,它们也是正确的。我错过了什么?

这是指向 HTML 的链接:http://pastebin.com/CWLuafVq

你缺少引号(虽然你说你试过了),我认为它应该有效。您的查询应为:

SELECT * FROM users where users.username='$user' AND users.password='$pass'

您的查询容易受到 SQL 注入的影响,为了避免它(并避免在 SQL 语句中要求引号之类的麻烦),您应该使用 PreparedStatement。

对于您的示例,您只需要在查询中将$user和$pass括起来。

但!!!!!!您的查询对 SQL 注入开放。您应该更改编写查询的方式。改用绑定参数,那么您几乎可以忘记这个问题。

例:

$stmt = $conn->prepare("SELECT * FROM users where users.username= ? AND users.password = ?");
$stmt->bind_param('ss', $user, $pass);
$stmt->execute();
$result = $stmt->get_result();

有关更多信息,请参见此处

就目前而言,当您的变量放入 sql 查询时,它最终看起来像这样WHERE users.username=goelakash AN...。如果没有用户名和密码的引号,mysql 会认为您正在比较两列。

您的查询需要看起来像这样。

$sql = "SELECT * FROM users where users.username='"$user'" AND users.password='"$pass'"";

帮自己一个大忙,并在调用mysqli_query()后放置 mysqli_error() 调用。这些将确切地告诉你mysql在哭泣什么。

还值得注意的是,您的查询对 sql 注入是开放的,您应该查看准备好的语句来缓解这种情况。

请确保您的数据库密码是"root"?如果是,则遵循查询字符串

$sql = "SELECT * FROM users WHERE users.username='$user' AND users.password='$pass'";

只需更换它。我认为它会正常工作:)