0

很少有人在一开始就遇到同样的问题,但是,我重复这个问题,因为我的问题似乎是特定于电子邮件 ID。

我有一个查询,可以检索给定特定电子邮件 ID 作为输入的密码。这是我的查询

Select Password from userauth where user_name in (select id from users where email = 's.sriram@example.com')

当从 phpMyAdmin 完成时,此查询执行没有任何问题。

但是,当我通过 php 脚本执行此操作时,它不起作用。该php脚本如下:

<?php

// Grab User submitted information
$email = $_POST["users_email"];
$pass = $_POST["users_pass"];

// Connect to the database
$con= mysql_connect("localhost","root","sriram123");
// Check connection
if (mysqli_connect_errno())
{
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
// Select the database to use
mysql_select_db("mydb",$con);

echo "Select Password from userauth where user_name in (select id from users where email = '$email')";

$result = mysql_query("Select Password from userauth where user_name in (select id from users where email = $email)");

if($result === FALSE) {
    echo "Error Occured. ";
    die(mysql_error()); // TODO: better error handling
}

while($row = mysql_fetch_array($result))
{
    echo $row['Password'];
}


mysqli_close($con);
?>

现在,当我执行它时,我收到这样的错误消息:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“@example.com)”附近使用正确的语法

我是 PHP 新手,我只是不确定为什么这个东西在 phpMyAdmin 中有效,但在我的 PHP 脚本中无效。

4

4 回答 4

6

xkcd

看起来您没有在变量周围加上正确的引号,但您应该使用mysql_real_escape_string它来确保在查询中使用它实际上是安全的。

于 2013-09-15T16:23:41.067 回答
2

1) 使用 PDO

2) 转义 MYSQL 名称 (Select Password from -> Select `Password` from)

3) 引用变量 ($email -> '$email')

4) 切勿暴露您的密码 ( $con= mysql_connect("localhost","root","PASSWORD");)

从这个开始:)

于 2013-09-15T16:22:58.213 回答
1
$result = mysql_query("Select Password from userauth where user_name in
    (select id from users where email = $email)");

如果 $email 是a@b.com这样的:

$result = mysql_query("Select Password from userauth where user_name in
    (select id from users where email = a@b.com)");

您缺少''电子邮件地址周围的字符串,因为它是一个字符串。

此外,请始终使用mysql_real_escape_string转义输入查询的每个外部字符串,否则您的站点将容易受到SQL 注入攻击

于 2013-09-15T16:26:47.013 回答
0

$email您在变量周围没有正确的引号。尝试将它们用单引号括起来。

将您的代码更改为:

$email = mysql_real_escape_string($email); //escaping
$query = "
SELECT Password
FROM userauth
WHERE user_name IN
    (SELECT id
     FROM users
     WHERE email = '$email')
     ";

$result = mysql_query($query);

此外,就目前而言,您的 MySQL 查询容易受到SQL 注入的攻击,您应该考虑转义用户输入。更好的是,停止使用已弃用的mysql_*功能并切换到MySQLior PDO

于 2013-09-15T16:24:11.020 回答