您可以在同一查询中选择和更新吗?我正在尝试根据侧边栏的观点计算观看次数以创建热门博客帖子。
$sql = mysql_query("SELECT * FROM articles WHERE id='$id' LIMIT 1
UPDATE pages SET views=views+1 WHERE ID=$id");
答案 0 :(得分:4)
不,你做不到,但做两个查询没有错。
mysql_query("UPDATE pages SET views=views+1 WHERE ID=$id");
$sql = mysql_query("SELECT * FROM articles WHERE id=$id");
此外,如果id
是主键,则您不必在此处LIMIT 1
,id
是唯一的,因此它始终只有一个符合您条件的结果。< / p>
答案 1 :(得分:3)
基本上,不,你不能SELECT
和UPDATE
使用相同的查询。您唯一的选择是编写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。