如何在SQL语法中调试错误?

时间:2012-08-27 14:54:39

标签: php mysql debugging error-handling authentication

我是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. 我不知道如何调试这个,我该如何继续查找错误?任何线索?

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

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

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

    如果有人能帮助我,我真的很感激!

4 个答案:

答案 0 :(得分:8)

<强> STOP

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

您的语法错误几乎肯定是由注入错误引起的,毫无疑问是在您插入查询的数据中的某个地方的额外'。您将原始用户提供的数据传递到查询中,允许恶意用户接管您的服务器,销毁您的数据库,踢你的狗等...

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

答案 1 :(得分:0)

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

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

我看到你正在通过'1''1'是一个字符串,而1是一个整数。

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

答案 2 :(得分:0)

初学者这样做:

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

  2. 将语句复制到您喜欢的SQL编辑器并完成它,尝试查找错误。

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

答案 3 :(得分:0)

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

在变量上打印$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的漏洞并将其解决,我对此非常陌生。

感谢您的更正和提示!