【问题标题】:MYSQL error with PHP formPHP表单的MYSQL错误
【发布时间】:2011-11-30 14:54:38
【问题描述】:

这可能是一个菜鸟问题,但我找不到我的代码有什么问题,而且我仍然收到 mysql 错误。

我正在使用此代码向 MYSQL 数据库提交表单 ->

    if($forename == '' || $surname == '' || $email == '' || $address1 == '' || $address2 == '' || $terms == ''){
        $_SESSION['status'] = 'error';
    } else {
            $sql = "INSERT INTO dbEntry ('forename','surname','email','address1','address2','terms')
            VALUES ('$forename','$surname','$email','$address1','$address2','$terms')" or die(mysql_error());
            $results = mysql_query($sql);

            if ($results) { echo "Details added."; }

            //if (mysql_error()) echo mysql_error();

        $_SESSION['status'] = 'success';
    }

//Print query for debugging ->
echo $sql;

但它抛出了这个错误 ->

INSERT INTO dbEntry ('forename','surname','email','address1','address2','terms') VALUES ('asd','asd','asd@asd.com',' asd','as','NULL')
错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 ''forename','surname','email','address1','address2','terms') 附近使用的正确语法 VALUES ('asd','as ' 在第 1 行

我已经为这个结构创建了一个表 ->

id INT(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
forename VARCHAR(32) NOT NULL,
surname VARCHAR(32) NOT NULL,
email VARCHAR(64) NOT NULL,
address1 VARCHAR(64) NOT NULL,
address2 VARCHAR(64) NOT NULL,
terms TINYINT(1)

我看不到任何语法错误,我哪里出错了?抱歉,如果我包含了太多信息。

干杯

【问题讨论】:

    标签: php mysql forms


    【解决方案1】:

    不要在插入列列表中将列名括在单引号中。

    INSERT INTO dbEntry (forename,surname,email,address1,address2,terms) VALUES ('asd','asd','asd@asd.com','asd','as','NULL') 
    

    如果您的列名恰好是 MySQL 保留关键字,或者包含空格、连字符或其他特殊但有效的字符,则必须用反引号将它们括起来:

    INSERT INTO tbl (`desc`, `space table`, `etc`)...
    

    作为提示,当 MySQL 打印语法错误时,99% 的错误发生在 right syntax to use near " 开头引号开始的确切字符处。

    【讨论】:

    • 已修复,也很有帮助。谢谢!
    【解决方案2】:
    INSERT INTO dbEntry (forename,surname,email,address1,address2,terms) VALUES ('asd','asd','asd@asd.com','asd','as','NULL')
    

    【讨论】:

      【解决方案3】:

      那里发生了一些奇怪的事情......

      $sql = "INSERT INTO dbEntry ('forename','surname','email','address1','address2','terms')
                  VALUES ('$forename','$surname','$email','$address1','$address2','$terms')" or die(mysql_error());
      

      实际上没有意义 - 如果字符串为空,您正在为字符串分配一个值并告诉程序死亡(使用 mysql_error()) - die() 应该反映来自 mysql_query( ) 函数 - 当该函数返回 false 时,您希望它死掉。哦,正如@Michael 指出的那样 - 不要将您的字段名称用引号(撇号)括起来 - 如果需要,请使用反引号。

      if ($results) { echo "Details added."; }
      $_SESSION['status'] = 'success';
      

      这意味着只有如果查询成功执行,您才会回显“添加详细信息” - 但是即使查询失败,您也将“成功”分配给 $_SESSION['status'] .

      我会尝试类似以下的方法;我已经添加了一些转义符——以防你错过它们:) 因为 PHP 是松散类型的空字符串,并且 (int) 0 可以评估为 (bool) false - 所以!$forename 将等同于$forename == '' .

      $forename = mysql_real_escape_string($forename);
      $surname = mysql_real_escape_string($surname);
      $email = mysql_real_escape_string($email);
      $address1 = mysql_real_escape_string($address1);
      $address2 = mysql_real_escape_string($address2);
      $terms = (int) $terms;
      
      if(!$forename || !$surname || !$email || !$address1 || !$address2 || !$terms) {
        $_SESSION['status'] = 'error';
      }
      
      else {
        $sql = "INSERT INTO dbEntry(forename, surname, email, address1, address2, terms) "
             . "VALUES ('{$forename}', '{$surname}', '{$email}', '{$address1}', '{$address2}', {$terms})";
      
        $response = mysql_query($sql);
        if(!$response) {
          die(mysql_error());
        }
        else {
          echo "Details added";
          $_SESSION['status'] = 'success';
        }
      }
      

      【讨论】:

      • 很好,对你很有帮助。我已经添加了一些。干杯
      • 不用担心 - 在我吃午饭的时候给了我一些事情要做 - 我想现在可以回去工作了 :)
      【解决方案4】:

      它似乎试图在 terms 字段中插入字符串“NULL”,这是一个 int。

      【讨论】:

      • 您可以在 INT 字段中输入 NULL,只要它的值是 NULL 而不是字符串“NULL”(当然,如果该字段允许 NULL)。
      • @CD001,不过,“NULL”在引号中。那不代表字符串“NULL”而不是NULL值吗?
      • 是的,这就是我的意思 - 您可以在 INT 字段中使用 NULL,但不能使用 "NULL" ;)
      【解决方案5】:

      您的列列表不应使用引号。还可以使用转义函数来确保在将某些内容放入数据库时​​不会出现任何错误。

      $sql = "INSERT INTO (field, field) VALUES = ('". mysql_real_escape_string( $field ) ."', '". mysql_real_escape_string( $field ) ."')";
      

      为了得到更好的错误,在你的查询函数中使用这个:

      mysql_query( $sql ) or trigger_error (mysql_error());
      

      或者取决于你是否想继续运行你的脚本

      mysql_query( $sql ) or die (mysql_error());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多