在同一查询中选择并更新

时间:2013-07-11 01:44:30

标签: php mysql

您可以在同一查询中选择和更新吗?我正在尝试根据侧边栏的观点计算观看次数以创建热门博客帖子。

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

3 个答案:

答案 0 :(得分:4)

不,你做不到,但做两个查询没有错。

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

此外,如果id是主键,则您不必在此处LIMIT 1id是唯一的,因此它始终只有一个符合您条件的结果。< / p>

答案 1 :(得分:3)

基本上,不,你不能SELECTUPDATE使用相同的查询。您唯一的选择是编写STORED PROCEDURE,这是一种更先进的数据库交互技术。

答案 2 :(得分:2)

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

然而,它可以完成(并且在我写这篇帖子的一般性中回答这个问题 - 在你的特定情况下,应该避免)。请注意,启用多语句会增加SQL注入攻击的风险,因此应该很少进行(并且,只有在采取了足够的替代预防措施来避免或减轻此类攻击时)。

古老的ext/mysql扩展(您正在使用,但已在PHP v5.5中弃用,并且多年来一直强烈建议不要在新代码中使用它)对多语句没有官方支持。实际上,documentation明确指出:

  

描述

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

mysql_query() 向服务器上当前活动的数据库发送一个唯一的查询(不支持多个查询),该服务器与指定的 {{1 }}

但是,此限制仅在驱动程序级别can be overridden(以未记录/不支持的方式)强制执行,方法是设置驱动程序的link_identifier连接标志,如下所示(或者通过重新编译PHP以启用默认情况下):

CLIENT_MULTI_STATEMENTS

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

MySQLi,它是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; "); 的现代替代品,本身supports multi-statements没有这样的hackery。 PDO是一个更通用的数据库抽象库,也可以支持多语句in some circumstances