Mysqli_query返回0行(字符问题?)

时间:2018-09-22 17:38:58

标签: php mysql json

我对此php代码有疑问:

<?php
$data = json_decode($_POST['data'], true);
$user = mysqli_real_escape_string($conn, $data['username']);
$password = md5($data['password']);
$query = mysqli_query($conn, 'SELECT * FROM Utenti WHERE username = "$user" AND password = "$password"');
if(mysqli_num_rows($query) > 0){
    $status = 'ok';
} else{
    $status = 'error';
    session_destroy();
}
echo $status;?>

这是请求(使用json编码):

POST /login HTTP/1.1
Host: example
User-Agent: example
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: length

data=%7B%22username%22%3A+%22harry%22%2C+%22password%22%3A+%22potter%22%7D

当我按字面意义这样写查询“ SELECT * FROM Utenti WHERE username =“ harry” AND password =“ potter”时,这将返回“错误” bur,它将返回“ ok”。此外,语句'$ user ==“ harry”和$ password ==“ potter”返回true。可能是字符编码/ json问题吗?

p.s。我知道安全问题(md5,http),这只是一个测试

3 个答案:

答案 0 :(得分:1)

如果用单引号将字符串(您的SQL查询)封装起来,则不会扩展变量。您需要为此使用双引号:

$string = 'user="$user"';
// literally the string: user="$user"

$string = "user=\"$user\"";
// literally the string: user="harry"

答案 1 :(得分:1)

PHP中的单引号表示字符串的内容是按字面意义使用的。因此,它将不会插入$user$password变量的值-实际上会检查用户名"$user"

您应该将整个查询字符串括在双引号中,然后它应该可以工作。

答案 2 :(得分:0)

当您在用单引号引起来的select语句中使用“ $ user”和“ $ password”时,以这种方式更改select语句,变量将被视为文字。因此,您必须在语句中使用双引号,并在变量中使用单引号

"SELECT * FROM Utenti WHERE username = '$user' AND password = '$password'"