【问题标题】:SQL syntax error starting at '@'从“@”开始的 SQL 语法错误
【发布时间】:2012-12-13 11:54:21
【问题描述】:

当我运行包含“@”的字符串时,我的 mySQL 查询卡住了。我试过 htmlentities() 和 htmlspecialchars() 无济于事。这是我正在运行的:

    $name=$_POST['name'];
$first=$_POST['first'];
$last=$_POST['last'];
$bio=htmlentities($_POST['bio']);
$email=htmlentities($_POST['email']);
$pass=$_POST['pass'];
$date=date("m/d/y");
$bd=date('m-d-y',strtotime($_POST['month'].$_POST['date'].$_POST['year']));
$qer="insert into everything (user,first,last,bio,email,pass,date,bd) values ($name,$first,$last,$bio,$email,$pass,$date,$bd)";
if(!(mysql_query($qer,$con))){
    echo "no qer";
    echo mysql_error();
}

这是错误:

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 靠近 '@re5yhgr5tyhrtyhr5tyr5tyhrt,test@first.com,pass,12/13/12,01-01-70)' 在第 1 行

我最初只是在我的电子邮件参数中尝试它,但我现在知道它在哪里都有问题。 >:|

我假设“第 1 行”是 sql 的第一行,因为我的实际第 1 行是“”...

对不起,如果这很明显,提前谢谢!

【问题讨论】:

标签: php mysql sql


【解决方案1】:

插入数据类型为string 的值时,应用单引号括起来。 (也适用于日期、时间、日期时间等,只要不是数字即可

$qer="insert into everything (user, first, last, bio, email, pass, date, bd) 
      values ('$name', '$first', '$last', ...)";

但是上面的查询很容易被SQL Injection攻击,请阅读下面的文章来了解如何防止SQL Injection

【讨论】:

  • @KuyaJohn 关于 SQL 注入的要点。 PHP 初学者倾向于构建可能被恶意编码器在几秒钟内删除的网站。
  • 因为我不想将我的东西切换到 sqli 或 pdo,所以 mysql_real_escape_string() 可以正常工作吗?编辑:nvm...
【解决方案2】:

尝试:在 varchar、char 或 date 类型的字段中添加撇号 (')。

 ...values ('$name','$first','$last','$bio','$email','$pass','$date','$bd')...

【讨论】:

  • 虽然这确实回答了问题,但它也会使代码对 SQL 注入攻击敞开大门。至少,在插入数据库查询字符串之前对所有内容使用 mysql_real_escape_string,或者更好地使用 PDO 或 mysqli,它们安全、高效且不需要引号。
  • @Anton mysql_real_escape_string 并不能完全阻止您的 sql 注入,请参见此处:SQL injection that gets around mysql_real_escape_string()
  • 漂亮实用的 cmets。谢谢。
  • @KuyaJohn 你完全正确。有一些字符可以绕过 mysql_real_escape_string 并允许注入。我只是不想让提问者不知所措,因为他们才刚刚开始:)
【解决方案3】:

您应该将插入 sql 的参数包装在字符串中,例如 "test@first.com"

【讨论】:

  • 这没有抓住重点。 OP 应该使用准备好的语句。
猜你喜欢
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
相关资源
最近更新 更多