【问题标题】:mysql error with insert commandmysql 插入命令出错
【发布时间】:2012-05-26 08:17:59
【问题描述】:

所以,我正在创建一个密码更改表

当一些 1 更改通过时,我在 PassChange 表中插入他的用户名、newpass 和确认码,(所以我之后给他发送一封确认电子邮件)这个想法很简单,这是我使用的代码

 $insertResult=mysql_query("INSERT INTO TempChangePass (UserName, NewPass, ConfirmationCode) VALUES ('$UserName', '$newPass', '$code')") or die (mysql_error());

虽然我得到了这个错误: 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“用户名”、“4da59df8d4007807e7230e0881fbf774”、“16585482”)附近使用正确的语法

注意:表中所有列的格式都设置为varchar。

mysql数据库连接正常,表名正确。

这个问题快把我逼疯了,我就是不知道问题出在哪里,如果有人能帮助我,将非常感激:)

提前致谢。

编辑: 我实际上已经解决了,仅针对通过搜索解决方案访问此帖子的人,如果您的 sql 命令遇到类似问题,请尝试回显它,并查看字符串是如何移动到数据库的 :-),快乐编码大家。

对不起,如果我浪费了你的任何时间 :) 我对 php 和 mysql 很陌生 :D

【问题讨论】:

  • 您的用户名变量中是否有'print_r($UserName)。然后,去见Bobby tables,然后阅读prepared statements
  • 尝试(暂时)更改您的代码,以便您首先组装查询,然后转储整个查询,以便您查看发生了什么。即$q = "INSERT INTO TempChangePass (UserName, NewPass, ConfirmationCode) VALUES ('$UserName', '$newPass', '$code')"; 然后var_dump( $q ) 这样您就可以看到您正在生成的确切查询。这应该让你看到问题出在哪里。

标签: php mysql database insert


【解决方案1】:

在进行查询之前尝试使用清理脚本。

使用

mysql_real_escape_string()

编辑

您现在应该使用MySQLi 版本

mysqli_real_escape_string()

或OOP方法

mysqli::real_escape_string()

Why use MySQLi instead of MySQL?

【讨论】:

    【解决方案2】:

    试试这个:

    $insertResult=mysql_query("INSERT INTO TempChangePass(UserName, NewPass, ConfirmationCode) VALUES('$UserName', '$newPass', '$code')") or die (mysql_error());
    

    您的 SQL 中有一些额外的空格。

    【讨论】:

      【解决方案3】:

      看起来您的实际用户名中有单引号 - 您实际上传递的是 'username' 而不仅仅是 username。尝试删除它们,看看它是否会起作用。

      处理此问题(并防止 SQL 注入)的推荐方法是使用 prepared statements,但是如果您真的想要,您可以使用 mysql_real_escape_string($UserName) (reference) 内联执行此操作

      【讨论】:

        【解决方案4】:

        删除变量周围的单引号。 PHP 将它们解释为字符串。

         $insertResult=mysql_query("INSERT INTO TempChangePass (UserName, NewPass, ConfirmationCode) VALUES ('" . $UserName. "', '" . $newPass. "', '" . $code . "')") or die (mysql_error());
        

        此外,您可能想要执行以下操作:

        $sql = "INSERT INTO TempChangePass (UserName, NewPass, ConfirmationCode) VALUES ('" . $UserName. "', '" . $newPass. "', '" . $code . "')";
        
        echo $sql;
        

        获取该回显,并尝试手动运行它。

        【讨论】:

        • 哦,那么在处理varchars的时候,就不用加引号了?
        • 您仍然想在它们周围加上单引号,但请确保您传递的是变量,而不是实际的单词:'$username'。如果您查看我提供的代码行,您会发现我仍然在每个变量前后使用您的单引号。
        • 或者,您可以用花括号 {$Username} 将变量括起来,以便更好地将变量与文本的其余部分区分开来。有时,以这种方式阅读会更容易一些。
        • 啊哈,好吧,我使用了你的代码,我得到了完全相同的错误:(
        • 也用了花括号,还是一样
        【解决方案5】:

        您是否尝试过逐列查询?

        我的意思是:

        INSERT INTO TempChangePass (UserName) values ( '$UserName' ); 
        

        然后加起来?

        主要是在我遇到错误时为我工作 ;)

        只是一个想法。

        【讨论】:

          【解决方案6】:

          看起来像 sql inyection。我很确定你的 $username 是 $username = "username'"。看单引号。所以查询变成了:

          $insertResult=mysql_query("INSERT INTO TempChangePass (UserName, NewPass, ConfirmationCode) VALUES ('username*''*, '4da59df8d4007807e7230e0881fbf774', '16585482')") 或者死掉 (mysql_error( ));

          【讨论】:

          • 我看到了那个额外的引用,我想:嗯,这个引用不应该在这里,但我的用户名是这样的:$UserName='username';
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-12-11
          • 1970-01-01
          • 1970-01-01
          • 2010-12-20
          • 1970-01-01
          • 2011-08-07
          • 2011-04-12
          相关资源
          最近更新 更多