您可以在同一个查询中选择和更新吗?我正在尝试计算查看次数,以按我的侧边栏的查看次数创建热门博客文章。
$sql = mysql_query("SELECT * FROM articles WHERE id='$id' LIMIT 1
UPDATE pages SET views=views+1 WHERE ID=$id");
不,你不能这样做,但是做两个查询没有错。
mysql_query("UPDATE pages SET views=views+1 WHERE ID=$id");
$sql = mysql_query("SELECT * FROM articles WHERE id=$id");
此外,如果id
是您不必LIMIT 1
在这里做的主键,id
它是唯一的,因此它总是只有一个与您的条件匹配的结果。
SELECT
基本上,不,您不能UPDATE
使用相同的查询。您唯一的选择是编写一种STORED PROCEDURE
更高级的数据库交互技术。
正如其他人所观察到的,您可以通过单独调用相关函数调用将多个命令发送到数据库。很少(如果有的话)需要在单个函数调用中向服务器提交多个命令。
然而,它是可以做到的(我写这篇文章是为了回答这个问题——在你的特殊情况下,应该避免)。请注意,启用多语句会增加 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,一个更通用的数据库抽象库,在某些情况下也可以支持多语句。