为什么我的查询不适用于mysql?语法似乎是正确的

时间:2013-04-30 21:25:54

标签: php mysql

我正在尝试执行一个寄存器类。但查询不起作用(查询突出显示。这似乎是一个简单的问题,但我没有看到它。我回应查询并复制并通过phpmyadmin执行它sql查询框,它说错误1064.我似乎无法找到任何问题。

    <?php
class register
{
    protected $username;
    protected $password;
    protected $email;
    protected $postcode;

    public function __construct()
    {   
    }

    public function insertuser($username, $password,$email, $postcode)
    {
        $this->_email = mysql_real_escape_string($email);
        $this->_password = mysql_real_escape_string($password);
        $this->_username = mysql_real_escape_string($username);
        $this->_postcode = mysql_real_escape_string($postcode);



    **$query = "INSERT INTO 'users'('user_id', 'username', 'password', 'email', 'postcode') VALUES  (NULL,'{$username}','{$password}','{$email}','{$postcode}');";**


        echo $query;
        $result = mysql_query($query);
        return $result;
    }


}
?>

4 个答案:

答案 0 :(得分:1)

error 1064表示SQL语法错误。您在表名和列名称周围使用了单引号:'。用背景代替它们:`

"INSERT INTO `users` (
  `user_id`, `username`, `password`, `email`, `postcode`
) VALUES  (
   NULL,'{$username}','{$password}','{$email}','{$postcode}'
);"

请注意,您不应该使用mysql扩展名编写新代码。 PHP开发人员已将其标记为已弃用。请改用PDOmysqli

答案 1 :(得分:0)

语法似乎错了。表名和列名不应该有引号。他们应该有反击或什么也没有。否则,它们将被视为字符串文字。

INSERT INTO users (user_id, username, password, email, postcode)
VALUES  (NULL,'{$username}','{$password}','{$email}','{$postcode}')

如果值列表完整且按顺序,您也不需要字段列表。结尾的分号是不可取的(虽然无效)。


您的代码很容易被注入。您应该使用PDO或mysqli

正确参数化查询

答案 2 :(得分:0)

您的表和列周围有单引号。你将这些与反引号混淆 - 除非你使用reserved word(你应该避免使用IMO),否则这是不必要的。

此外,您没有使用已清理的变量,因此容易受到SQL injection的攻击。<​​/ p>

INSERT INTO users (user_id, username, password, email, postcode) VALUES (NULL,'{$this->_username}','{$this->_password}','{$this->_email}','{$this->_postcode}');

强制性: mysql_*函数将为deprecated in PHP 5.5。建议不要编写新代码,因为将来会将其删除。相反,可以是MySQLiPDObe a better PHP Developer

答案 3 :(得分:0)

除了使用预准备语句之外,你绝对应该考虑切换到mysqli。使用预先准备的语句可以使您的查询更容易,并进一步保护您免受注射。

请参阅http://php.net/manual/en/mysqli.prepare.php

至于你的错误,有一些问题。不要使用引号调用数据库。不要使用引号处理表名。这些都是Explosion Pills所指出的。

最后,我没有看到你打开mysqli连接的位置。