【问题标题】:How to debug an error in SQL syntax?如何调试 SQL 语法中的错误?
【发布时间】:2012-08-22 02:04:17
【问题描述】:

我是 SQL/PHP 新手,无法克服错误消息:

"You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near '1',"

我正在尝试调试此错误,但我在脚本中查找“1”,但我只有这一点:

//enter information into table
$sql = "INSERT INTO $_SESSION[table_name] VALUES 
        ('$_POST[first_name]', '$_POST[last_name]', '$_POST[user_name]', 
           password('$_POST[password]'), 'Administrators', '', '', '0', '$_SESSION[admin_email]',
          '$_POST[redirect_to]', '1', '$date')";

$result = @mysql_query($sql,$connection) or die(mysql_error());

if($result)
{...
  1. 我没有发现任何问题。

  2. 我不知道如何调试,我应该如何继续查找错误?有什么线索吗?

我不确定我是否在正确的位置查看脚本,但这是我有“1”的唯一条目,错误消息告诉我要查看...

查看手册后,SQL 中的语法似乎是正确的...我在 WAMP 服务器中使用 MySQL 5.5.24

我正在尝试安装“Login-Redirect v1.31”以进行用户身份验证。

如果有人可以帮助我,我将不胜感激!

【问题讨论】:

  • 您应该做的第一件事是打印出您正在生成的 SQL - 里面的东西不是您期望的格式。
  • 这可能无助于回答您的问题,但您应该停止使用mysql_* 函数。它们正在被弃用。请改用PDO(PHP 5.1 起支持)或mysqli(PHP 4.1 起支持)。如果您不确定要使用哪一个,read this article.
  • 您的代码容易受到 SQL 注入的攻击。您真的应该使用prepared statements,将变量作为不获得 SQL 评估。如果你不知道我在说什么,或者如何解决它,请阅读 Bobby Tables 的故事。

标签: php mysql debugging error-handling authentication


【解决方案1】:

停止

在进一步使用此代码之前,请阅读SQL injection attacks修复您的代码

您的语法错误几乎肯定是由注入错误引起的,毫无疑问是由于您要插入查询的数据中某处的额外'。您正在将用户提供的原始数据传递到查询中,从而允许恶意用户接管您的服务器、破坏您的数据库、踢您的狗等等……

除此之外,执行echo $sql 并将结果粘贴到此处,我们将能够准确地向您显示错误的' 的位置。

【讨论】:

  • 我将阅读有关注入攻击的信息。谢谢! $echo 打印:INSERT INTO authorize VALUES ('Francisco', 'Arantes', 'myusername', password('********'), 'Administrators', '', '', '0', 'mymail@mail.com', ' 并停止。
  • 在浏览器的页面上执行“查看源代码” - 没有理由让 sql 语句“停止”,除非浏览器隐藏了 html 或其他看起来像 html 标记的内容.这可以解释出现在您的错误消息中的>。永远不要相信您的浏览器显示的内容 - 始终查看页面源代码。
  • 谢谢!我得到了答案,但无法上传 8 小时,因为我是新手并且没有足够的声望点。打印 echo 语句后,我意识到问题出在 $_POST[redirect_to] 定义不明确。
  • 虽然注入攻击是使用参数化查询的主要原因,但更容易看出哪里出了问题,不应该打折扣。
【解决方案2】:

第一步是隔离查询的引用部分。

您的错误是引用了一个列,并插入了一个字段。

我看到你传递了一个'1''1' 是一个字符串,而 1 是一个整数。

如果您的 Column Schema 说它是 int 列类型,则删除单引号并重试。

【讨论】:

    【解决方案3】:

    对于初学者来说,这样做:

    1. 使用echo 语句将 $sql 打印到屏幕(或将其记录到文件)。

    2. 将语句复制到您最喜欢的 SQL 编辑器中并通过它来查找错误。

    很难在不知道代码执行时绑定哪些变量的情况下调试动态 SQL 语句。

    【讨论】:

      【解决方案4】:

      非常感谢大家帮我解决这个问题。

      在变量上打印$echo 给了我答案。问题在于 $_POST[redirect_to] 不起作用,因为它之前没有很好地定义。

      我将输入变量更改为空字符串,它起作用了:

      $sql = "INSERT INTO $_SESSION[table_name] VALUES 
              ('$_POST[first_name]', '$_POST[last_name]', '$_POST[user_name]', 
              password('$_POST[password]'), 'Administrators', '', '', '0', 
              '$_SESSION[admin_email]', ' ', '1', '$date')";
      
      $result = @mysql_query($sql,$connection) or die(mysql_error());
      
      if($result){
          // ...
      }
      

      我将研究SQL injections 的漏洞并解决它,我对此很陌生。

      感谢您的指正和提示!

      【讨论】:

        猜你喜欢
        • 2019-05-22
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多