【问题标题】:PHP: Error on Update statement with subqueryPHP:带有子查询的更新语句出错
【发布时间】:2017-08-22 17:03:28
【问题描述】:

我有一个更新特定用户数据的页面。用户有位置,这是一个外键。查询更新(如下)在没有位置的情况下工作正常,但在位置上我得到以下错误。

查询:

 $queryUpdate = "UPDATE visitorsystem.employee SET idNumber = '$idNumber', name = '$name',
                            surname = '$surname',
                            position = 'SELECT positionid FROM visitorsystem.position WHERE positionName LIKE '%$position%'',
                            email = '$email'
                            WHERE employeeid = '$empId'";

                            $resultUpdate = mysqli_query($connection,$queryUpdate)
                                or die("Error in query: ". mysqli_error($connection));

查询错误:您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本以获得正确的语法 在'SELECT positionid FROM visitorsystem.position WHERE附近使用 positionName LIKE '%Informat' 在第 3 行

我已经尝试通过使用内部联接来解决问题,因为我已经看到堆栈上给出了一些解决方案,但没有任何效果。有什么建议吗?

【问题讨论】:

  • 您的子查询不应在引号之间,而应在括号之间
  • 警告:当使用mysqli 时,您应该使用parameterized queries 和bind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了严重的SQL injection bug。 切勿将$_POST、$_GET或任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 注意:mysqli 的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query 接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…) 和 $db->prepare("…”) 程序接口是 PHP 4 时代引入的 mysqli API 的产物,不应在新代码中使用。

标签: php mysql sql-update subquery


【解决方案1】:

子查询位于常规括号内,而不是引号内,因此在一般意义上:

SELECT x FROM y WHERE z IN (SELECT z FROM a)

单引号和双引号(默认)仅用于字符串值。

【讨论】:

  • 括号里我也试过了,可惜还是不行
  • “不起作用”不是有用的诊断。您可能还有其他问题。检查您的错误日志以获取详细信息。得到一些东西我们可以用来帮助你。
  • 我多次尝试将整个子查询放在括号中,并给出了解析错误。我关闭了浏览器并再次应用了更改,不知何故它有所作为,这次奏效了。相当混乱..感谢您的帮助:)!我也会注意安全问题,谢谢指出
猜你喜欢
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
相关资源
最近更新 更多