【问题标题】:Getiing an error when trying to store user email and other details in MySQL?尝试在 MySQL 中存储用户电子邮件和其他详细信息时出错?
【发布时间】:2015-11-08 08:39:27
【问题描述】:

我创建了一个注册表单来获取用户的详细信息。但是当用户输入详细信息时,会出现此错误:

插入玩家(名字、姓氏、用户名、电子邮件、密码) 价值观(John,Doe,john.doe,john.doe@yahoo.com,doe) SQLSTATE[42000]:语法错误或访问冲突:1064 你有一个 SQL 语法错误;检查与您对应的手册 MySQL 服务器版本,用于在 '@yahoo.com 附近使用正确的语法, aman)' 在第 1 行

感谢您的注册!

这是我的表单 PHP 代码:

<?php
     $servername="localhost";
     $dbname="users";
     $username="root";
     $password="pass";
     try {

          $dbh=new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
          $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         $first_name = $_POST["first_name"];
         $last_name = $_POST["last_name"];
         $username = $_POST["username"];

         $email = $_POST["email"];
         $pwd = $_POST["password"];
    $sql="INSERT INTO players(first_name, last_name, username, email, password) VALUES ($first_name, $last_name, $username, $email, $pwd)";
         $dbh->exec($sql);
}
catch(PDOException $e) {
           echo $sql . "<br>" . $e->getMessage();
}

    echo "<p>Thank you for registering!</p>";

?>

我确实尝试 & catch 来捕捉错误,因为它没有显示

感谢您的注册!

并且数据没有存储在数据库中。

更新: 这是带有 PDO 的 Prepared 语句的代码:

<?php
     $servername="localhost";
     $dbname="users";
     $username="root";
     $password="pass";
     try {

          $dbh=new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
          $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         $first_name = $_POST["first_name"];
         $last_name = $_POST["last_name"];
         $username = $_POST["username"];

         $email = $_POST["email"];
         $pwd = $_POST["password"];
    $statement = $dbh->prepare("INSERT INTO players(first_name, last_name, username, email, password) VALUES (:first_name, :last_name, :username, :email, :pwd)";
    $statement->execute(array(':first_name' => $first_name, ':last_name' => $last_name, ':username' => $username, ':email' => $email, ':pwd' => $pwd));
}
catch(PDOException $e) {
           echo $sql . "<br>" . $e->getMessage();
}

    echo "<p>Thank you for registering!</p>";

?>

收到此错误:

解析错误:语法错误,意外';'在 public_html\php\reg.php 在第 16 行

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    每当您在查询中插入字符串时,都必须用引号括起来:

    $sql="INSERT INTO players(first_name, last_name, username, email, password) VALUES ('$first_name', '$last_name', '$username', '$email', '$pwd')";
    

    【讨论】:

      【解决方案2】:

      正如其他人所说,您应该在值周围使用引号。理想情况下,您应该改用 PDO 的预处理语句,它们具有自动转义值的好处,本质上更安全,并且具有速度和其他优势。

      $statement = $dbh->prepare("INSERT INTO players(first_name, last_name, username, email, password) VALUES (:first_name, :last_name, :username, :email, :pwd)");
      $statement->execute(array(':first_name' => $first_name, ':last_name' => $last_name, ':username' => $username, ':email' => $email, ':pwd' => $pwd));
      

      还使您的查询更易于阅读,请查看 PHP 的 PDO docs

      【讨论】:

      • 那么如果我想将我的代码转换为 PDO 的 Prepared 语句,该怎么做呢?你能编辑我的代码并简要介绍一下它是如何完成的。我以前试过,但没有成功。
      • 我给出的代码应该适用于你的脚本,用这两个语句替换你的 $sql=..and $dbh->exec() 行。
      • 收到此错误:解析错误:语法错误,意外';'在第 16 行的 public_html\php\reg.php 中
      • 有一个额外的报价,$statement-&gt;execute(array(':first_name' =&gt; $first_name, ':last_name' =&gt; $last_name, ':username' =&gt; $username, ':email' =&gt; $email, ':pwd' =&gt; $pwd));
      • 我已解决,但删除后出现此错误。
      【解决方案3】:

      你必须用单引号包裹你的变量

      $sql="INSERT INTO players(first_name, last_name, username, email, password) VALUES ('$first_name', '$last_name', '$username', '$email', '$pwd')";
      

      【讨论】:

      • 所以MySQL在邮件中@符号有问题?
      • 不,当不引用查询时,最终会成为 INSERT INTO player(...) VALUES (John, Doe, john@yourmail.com....),如您所见,这是无效的SQL 因为 MySQL 中的字符串需要用引号括起来才能像 INSERT INTO...VALUES ('John', 'Doe', 'john@....') 一样有效,如果它没有抛出错误在 @ 它会向 John 抛出,因为它会将其视为列名而不是字符串值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2012-11-13
      • 2014-04-25
      • 2021-06-29
      相关资源
      最近更新 更多