有谁知道这个PHP错误消息背后的含义?

时间:2011-04-28 03:56:28

标签: php mysql

解析错误:语法错误,意外T_ENCAPSED_AND_WHITESPACE,期待T_STRING或T_VARIABLE或T_NUM_STRING是消息。它来自这行代码:

$query = ("SELECT * 
             FROM users 
            WHERE user_name = $_POST['user_name'] 
                & password = $_POST['password'] 
                & user_type = $_POST['user_type']");

有没有人知道这一切的含义?如果是这样,有人知道如何处理这个问题吗?

6 个答案:

答案 0 :(得分:4)

使用:

$query = sprintf("SELECT u.* 
                    FROM USERS u
                   WHERE u.user_name = '%s' 
                     AND u.password = '%s' 
                     AND u.user_type = '%s' ",
                   mysql_real_escape_string($_POST['user_name']),
                   mysql_real_escape_string($_POST['password']),
                   mysql_real_escape_string($_POST['user_type']) );

$result = mysql_query($query);

参考

答案 1 :(得分:2)

您不能像这样插入$_POST。你需要用大括号({})来包装它们。当你已经在这样的字符串中时,你也不需要引用键名。

您还应引用这些值,并将&AND交换。

最后还需要;

您也不需要将其包装在括号中。

$query = "SELECT * 
         FROM users 
        WHERE user_name = '{$_POST[user_name]}' 
          AND password = '{$_POST[password]}' 
          AND user_type = '{$_POST[user_type]}'";

但是...

...不要直接插入用户输入。使用转义机制。

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$user_type = mysql_real_escape_string($_POST['user_type']);


$query = "SELECT * 
         FROM users 
        WHERE user_name = '$username' 
          AND password = '$password' 
          AND user_type = '$user_type'";

我建议使用PDO和绑定参数,而不是自己构建SQL。

此外,您会看到用户输入的密码直接用于在数据库中进行比较。使用某种形式的单向邮件摘要,例如bcrypt

答案 2 :(得分:0)

$username = mysql_real_escape_string($_POST["user_username"]);
$password = mysql_real_escape_string($_POST["user_password"]);
$type = mysql_real_escape_string($_POST["user_type"]);

mysql_query("SELECT * FROM users WHERE user_name='$username' AND user_password='$password' AND user_type='$type' LIMIT 1");

答案 3 :(得分:0)

要将一维数组值插值为字符串,请使用以下语法:

"foo = $_POST[bar]"

请注意没有引号。

要插入嵌套数组或通常使用普通语法,请使用大括号:

"foo = {$_POST['bar']}"

在任何情况下,尽管使用SQL查询执行此操作,您仍需要在将值插入查询之前转义值。所以,这样做:

$query = sprintf('SELECT foo FROM bar WHERE baz = "%s"',
                 mysql_real_escape_string($_POST['baz']));

答案 4 :(得分:0)

确保考虑SQL注入。

尝试:

$username = mysql_real_escape_string($_POST["user_username"]);
$password = mysql_real_escape_string($_POST["user_password"]);
$type = mysql_real_escape_string($_POST["uesr_type"]);
$query = "SELECT * FROM users WHERE user_name='$username' AND password='$password' AND 
 user_type='$type'";

$result = mysql_query($query);

答案 5 :(得分:0)

我还建议稍微阅读一下手册:http://us.php.net/manual/de/language.types.string.php#language.types.string.parsing。该链接将向您解释PHP如何解析字符串中的变量。