5

您可以在同一个查询中选择和更新吗?我正在尝试计算查看次数,以按我的侧边栏的查看次数创建热门博客文章。

$sql = mysql_query("SELECT * FROM articles WHERE id='$id' LIMIT 1
                    UPDATE pages SET views=views+1 WHERE ID=$id");
4

3 回答 3

3

不,你不能这样做,但是做两个查询没有错。

       mysql_query("UPDATE pages SET views=views+1 WHERE ID=$id");
$sql = mysql_query("SELECT * FROM articles WHERE id=$id");

此外,如果id是您不必LIMIT 1在这里做的主键,id它是唯一的,因此它总是只有一个与您的条件匹配的结果。

于 2013-07-11T01:57:54.267 回答
3

SELECT基本上,不,您不能UPDATE使用相同的查询。您唯一的选择是编写一种STORED PROCEDURE更高级的数据库交互技术。

于 2013-07-11T01:50:45.127 回答
2

正如其他人所观察到的,您可以通过单独调用相关函数调用将多个命令发送到数据库。很少(如果有的话)需要在单个函数调用中向服务器提交多个命令。

然而,它是可以做到的(我写这篇文章是为了回答这个问题——在你的特殊情况下,应该避免)。请注意,启用多语句会增加 SQL 注入攻击的风险,因此应该很少这样做(并且,只有在已采取足够的替代预防措施以避免或减轻此类攻击时)。

古老的ext/mysql扩展(您正在使用,但在 PHP v5.5 中已被弃用,并且多年来一直强烈反对在新代码中使用)没有对多语句的官方支持。事实上,文档清楚地指出:

描述

resource mysql_query ( string $query [, resource $link_identifier = NULL ] )

mysql_query()将唯一查询(不支持多个查询)发送到与指定link_identifier.

但是,此限制仅在驱动程序级别强制执行,并且可以CLIENT_MULTI_STATEMENTS通过设置驱动程序的连接标志(或通过重新编译 PHP 以默认启用)来覆盖(以未记录/不受支持的方式):

mysql_connect($host, $user, $pass, false, 65536);
mysql_select_db($db);
mysql_query("
  SELECT * FROM articles WHERE id='$id' LIMIT 1;
  UPDATE pages SET views=views+1 WHERE ID=$id;
");

这种方法的一个严重缺点是只能访问第一个命令的结果。如果后续命令返回结果(甚至失败),您的应用程序将无法使用此类信息。

MySQLi 是 .的现代替代品ext/mysql,本机支持多语句而没有这种骇客。PDO,一个更通用的数据库抽象库,在某些情况下也可以支持多语句。

于 2013-07-11T02:27:04.130 回答