我有以下脚本,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
答案 0 :(得分:1)
你错过了引号(虽然你说你试过)但我认为应该有效。您的查询应该是:
SELECT * FROM users where users.username='$user' AND users.password='$pass'
您的查询容易受到SQL注入的攻击,为了避免它(并避免在SQL语句中需要引号等麻烦),您应该使用PreparedStatement。
答案 1 :(得分:1)
就目前而言,当您的变量放入sql查询时,它最终看起来像WHERE users.username=goelakash AN...
。如果没有用户名和密码的引号,mysql会认为您正在比较两列。
您的查询需要看起来像这样。
$sql = "SELECT * FROM users where users.username=\"$user\" AND users.password=\"$pass\"";
在致电mysqli_query()
后,请帮助自己,put mysqli_error() calls。这些将告诉你mysql正在哭什么。
值得注意的是,您的查询对sql注入是开放的,您应该查看prepared statements来缓解这一点。
答案 2 :(得分:1)
对于您的示例,您只需要在$ user和$ pass中放置单引号。
BUT !!!!!!您的查询对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();
有关详细信息,请参阅here
答案 3 :(得分:1)
确保您的数据库密码是“root”?如果是,则按照查询字符串
$sql = "SELECT * FROM users WHERE users.username='$user' AND users.password='$pass'";
只需更换它。我认为它会正常工作:)