【问题标题】:PHP MySQL Query php parse error [duplicate]PHP MySQL查询php解析错误[重复]
【发布时间】:2016-04-02 18:16:12
【问题描述】:

我有这个mysql 查询:

$sql = "INSERT INTO lijsten(naam, niveau, nederlands, duits, frans, grieks,
engels, latijn, spaans, wiskunde, natuurkunde, scheikunde, geschiedenis,
economie, aardrijkskunde, ANW, godsdienst)
VALUES(\$_POST["naam"]\,\$_POST["niveau"]\,\$_POST["nederlands"]\,\$_POST["duits"]\,\$_POST["frans"]\,\$_POST["grieks"],\$_POST["engels"]\,\$_POST["latijn"]\,\$_POST["spaans"]\,\$_POST["wiskunde"]\,\$_POST["natuurkunde"]\,\$_POST["scheikunde"]\,\$_POST["geschiedenis"]\,\$_POST["economie"]\,\$_POST["aardrijkskunde"]\,\$_POST["ANW"]\,\$_POST["godsdienst"]\)";

通过这个函数发送到数据库:

function connectDB($sql) {
$DBcon = mysql_connect(host, user, pass) or die(mysql_error());
mysql_select_db(database);
$result = mysql_query($query) or die(mysql_error());
mysql_close($DBcon);
return $result;

但是当我尝试运行它时,它给了我一个 php 解析错误:

PHP Parse error:  syntax error, unexpected 'naam' (T_STRING) in /media/usbdisk/website/www/boeken/naardb.php on line 11

谁能告诉我我犯了什么错误?我已经尝试了多种查询方式,但都没有奏效。

【问题讨论】:

  • 您在构建 SQL 查询时犯了很多很多错误。研究使用准备好的语句。它不仅更安全,而且会使您正在创建的字符串连接问题变得毫无意义。
  • 您试图转义的引号不存在。但是,如上所述,甚至不用费心修复使用参数化查询的问题。此当前代码将对 SQL 注入开放。 naam 错误是因为" 正在关闭PHP 中$sql 变量的字符串封装。

标签: php mysql database parse-error php-parse-error


【解决方案1】:

有几个错误,但我将从问题开始。

unexpected 'naam' (T_STRING)...

是因为 PHP 不期望那里有一个字符串。您正在转义部分查询,但您实际上只需要连接 $_POST 变量。

我建议将帖子变量设置为它们自己的变量,以简化您的查询并像以下答案概述的那样格式化查询:Using php variables inside MySQL insert statement

IE:$naam = $_POST["naam"]; 等...

最大的问题是您使用的是不推荐使用的方法,您应该使用 PDO (Prepared) 查询

PHP deprecated methods.

您绝对应该考虑使用 PDO 并准备您的声明。

几个 PDO 的快速参考:

祝你好运!

【讨论】:

    【解决方案2】:

    尝试像这样连接查询中的变量:

    "INSERT INTO lijsten(naam, niveau, nederlands, duits, frans, grieks,
    engels, latijn, spaans, wiskunde, natuurkunde, scheikunde, geschiedenis,
    economie, aardrijkskunde, ANW, godsdienst)
    VALUES("
    .mysql_escape_string($_POST['naam']).
    ")";
    

    也可以阅读sql injections

    @meda 答案是如何使用PDO 创建 SQL 调用的正确示例。

    【讨论】:

      【解决方案3】:
      1. 您永远不应该构建这样的查询。
      2. 这不是您转义值的方式
      3. mysql_ is deprecated 你应该使用prepared statements

      Example in PDO:

      $sql = "INSERT INTO lijsten(naam, niveau, nederlands, duits, frans, grieks,
      engels, latijn, spaans, wiskunde, natuurkunde, scheikunde, geschiedenis,
      economie, aardrijkskunde, ANW, godsdienst)
      VALUES(:naam,:niveau .......)";
      
      if($stmt = $pdo->prepare($sql)){
          $stmt->bindValue(:naam, $_POST["naam"]);
          .....
          $stmt->execute();
      }
      

      【讨论】:

      • 我完全同意,但是当这个男孩(或女孩)显然是个菜鸟时,仅仅展示使用 PDO 而不链接到文档或 tut 并没有太大帮助......
      • @Jacques 抱歉,我必须做点什么,我更新了我的帖子
      • 赞成编辑:)
      • @Jacques 谢谢人 :)
      猜你喜欢
      • 2015-08-23
      • 2015-11-05
      • 2014-05-04
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 2017-10-21
      相关资源
      最近更新 更多