【问题标题】:Unable to locate sql error in php在php中找不到sql错误
【发布时间】:2014-09-07 00:10:35
【问题描述】:

我收到的错误消息

解析错误:语法错误,第 17 行的 D:\ServerFolders\Web\tokens\insert.php 中出现意外的“INTO”(T_STRING)

第 17 行

$sql= INSERT INTO users(Forename, Surname, Email, Username, Password, DOB) 

完整代码

    <?php
//Connect to DB
$con=mysql_connect(localhost,root, "",APROJECT) or die (mysql_error());
// Check connection
if (mysql_connect_errno()) {
 echo "Failed to connect to MySQL: " . mysql_connect_error();
}

// escape variables for security
$Forename = mysql_real_escape_string($con, $_POST['Forename']);
$Surname = mysql_real_escape_string($con, $_POST['Surname']);
$Email = mysql_real_escape_string($con, $_POST['Email']);
$Username = mysql_real_escape_string($con, $_POST['Username']);
$Password = mysql_real_escape_string($con, $_POST['Password']);
$DOB = mysql_real_escape_string($con, $_POST['DOB']);
//SQL query to add data to DB
$sql= INSERT INTO users(Forename, Surname, Email, Username, Password, DOB) 
VALUES ($Forename, $Surname, $Email, $Username, $Password, $DOB);

if (!mysql_query($con,$sql)) {
  die('Error: ' . mysql_error($con));
}
echo "1 record added";

mysql_close($con);
?>

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    尝试添加引号

    $sql= "INSERT INTO users(Forename, Surname, Email, Username, Password, DOB) 
    VALUES ($Forename, $Surname, $Email, $Username, $Password, $DOB)";
    

    【讨论】:

      【解决方案2】:

      首先,mysql_* 不再被支持,建议使用 PDO 或 mysqli_* 代替。

      您应该将查询放在引号中;

      $sql= "INSERT INTO users(Forename, Surname, Email, Username, Password, DOB) 
      VALUES ($Forename, $Surname, $Email, $Username, $Password, $DOB)";
      

      它可能不起作用!因为您必须将值放入单引号中。所以更好的方法是使用参数化查询。

      仅在这一次我建议使用 sprintf() 函数。

      $sql= sprintf("INSERT INTO users(Forename, Surname, Email, Username, Password, DOB) 
      VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s')", $Forename, $Surname, $Email, $Username, $Password, $DOB);
      

      【讨论】:

      • 没有使用 sprintf() 函数。第一个答案摆脱了仍在与其余部分作斗争的错误消息,但我知道如何处理它们。还将所有 mysql_* 交换为 mysqli_*。
      【解决方案3】:
      $sql= INSERT INTO users(Forename, Surname, Email, Username, Password, DOB) 
      VALUES ($Forename, $Surname, $Email, $Username, $Password, $DOB);
      

      上面一行需要是一个字符串,并且在一行中(字符串中以"开始和结束的变量可以直接写入其中):

      $sql = "INSERT INTO users(Forename, Surname, Email, Username, Password, DOB) VALUES ($Forename, $Surname, $Email, $Username, $Password, $DOB)";
      

      如果您希望它在多行中以获得更好的可读性,您可以使用 nowdoc 语法和嵌入在 {} 中的变量:

      $sql <<<'EOD'
          INSERT INTO users(Forename, Surname, Email, Username, Password, DOB) 
          VALUES ({$Forename}, {$Surname}, {$Email}, {$Username}, {$Password}, {$DOB})
      EOD;
      

      最后一种方法是将字符串与. 连接:

      $sql = "INSERT INTO users(Forename, Surname, Email, Username, Password, DOB) " .
             "VALUES (" . $Forename . ", " . $Surname . ", " . $Email . ", " . $Username . ", " . $Password . ", " . $DOB . ")";
      

      请参阅此参考:http://php.net/manual/de/language.types.string.php

      附带说明,不要忘记使用 mysql_real_escape_string 转义 mysql 查询中的变量以防止 SQL 注入!

      $sql = "INSERT INTO users(Forename, Surname, Email, Username, Password, DOB) " .
             "VALUES (" . mysql_real_escape_string($Forename) . ", " . mysql_real_escape_string($Surname) . ", " . mysql_real_escape_string($Email) . ", " . mysql_real_escape_string($Username) . ", " . mysql_real_escape_string($Password) . ", " . mysql_real_escape_string($DOB) . ")";
      

      【讨论】:

        【解决方案4】:

        您的 sql 查询似乎只是缺少一些引号。

        有点像

        $sql= "INSERT INTO `users`(`Forename`, `Surname`, `Email`, `Username`, `Password`, `DOB`) 
        VALUES (".$Forename.", ".$Surname.", ".$Email.", ".$Username.", ".$Password.", ".$DOB.")";
        

        应该修正你的错误。

        mysql_query 已贬值并且可能非常不安全,这也毫无价值。如果这将在生产中使用,那么可能值得查看 PDO 预先准备好的语句。查看http://php.net/manual/en/ref.pdo-mysql.phpDream in Code PDO

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-01
          • 1970-01-01
          • 2020-01-13
          • 2015-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多