gpt4 book ai didi

php - 直接在 PHP CLI 和 MySQL 中运行时,数据库查询返回不同的结果

转载 作者:可可西里 更新时间:2023-11-01 08:37:41 24 4
gpt4 key购买 nike

我在以下脚本中遇到问题。当通过 PHP CLI 运行下面的脚本时,标记的查询返回单个结果。如果我将脚本回显到屏幕上,并直接在 MySQL 上运行它,查询将返回 14 个结果(应该如此)。我一直无法找到造成这种差异的任何原因。

此时我只查看循环的第一次迭代。运行第一个循环的查询大约有 200 个结果。奇怪的是,有时第二个查询运行的结果数量是正确的。所以我现在只关注第一次迭代。

//This line allows the GROUP_CONCAT in the next query to pull all the values 
// it should rather than being limited too far.
$select = "SET SESSION group_concat_max_len = 6000";
mysql_query($select);

$select = "SELECT
COUNT(*) AS Notes, n.PID, n.CreatedDate, p.ClientID, n.Body,
GROUP_CONCAT(n.CNID SEPARATOR ',') AS NoteIDs
FROM CNTbl n INNER JOIN PTbl p ON n.PID = p.PID
WHERE n.Body LIKE '%>No Contact Letter<%'
GROUP BY n.PID, n.CreatedDate, n.Body
HAVING Notes > 1
ORDER BY n.CreatedDate";

$result=mysql_query($select);

while($row = mysql_fetch_array($result)) {
list($NoteCount, $PID, $CreatedDate, $ClientID, $Body, $NoteIDs) = $row;
$NoteIDList = explode(',', $NoteIDs);
$DateParts = explode(' ', $CreatedDate);

############## The issue is with this query. ##############
$getNoteList = "SELECT p.PID
FROM MTbl m
INNER JOIN ATbl a ON m.AID = a.AID
INNER JOIN PTbl p ON a.PID = p.PID
WHERE DATE(m.CreatedDate) = date('$CreatedDate')
AND p.ClientID = $ClientID";
$resultNoteList = mysql_query($getNoteList);

$place = 0;
while ($row2 = mysql_fetch_assoc($resultNoteList)) {
$newBody = preg_replace('/'.$PID.'/', $row2['PID'], $Body);
$getNoteID = "UPDATE CNTbl
SET PID={$row2['PID']}, Body='$newBody'
WHERE CNID={$NoteIDList[$place++]}";
mysql_query($getNoteID);
}
}

表详细信息:

MTbl

Field       Type         Null Key   Default
MID bigint(20) NO PRI NULL
AID bigint(20) YES MUL NULL
CreatedDate timestamp NO "" CURRENT_TIMESTAMP

ATbl

Field   Type         Null Key   Default
AID bigint(20) NO PRI NULL
PID bigint(20) YES MUL 0

PTbl

Field      Type         Null Key   Default
PID bigint(20) NO PRI NULL
ClientID bigint(20) YES MUL 0

CNTbl

Field         Type         Null  Key   Default
CNID bigint(20) NO PRI NULL
Body text YES "" NULL
CreatedDate datetime NO "" NULL
PID bigint(20) YES MUL NULL

附加信息:

  1. 我坚持使用 PHP mysql 函数而不是切换到 mysqli,因为这是一个旧项目中几个人的协作。
  2. 我正在使用 PHP 5.1.6
  3. 我正在使用 MySQL 5.0.77

我已尝试包含所有必要信息。如果我遗漏了任何有用的东西,请告诉我。

最佳答案

与通过 Apache 运行查询时相比,您使用 CLI 获得的 mySQL 实例不同。

当您在 shell 中连接到服务器时,您将以非特权用户的身份连接(大概)。当您执行任何命令时,您将使用您的用户帐户的权限执行此操作。

在您的服务器上运行并响应外部请求的 apache 和 mysql 实例正在特权用户下运行。因此,当您连接到您的 shell 时,这些实例无法直接与之交互——它们不“属于”您的用户。当您执行 mysql... 命令时,操作系统会启动一个新的 mySQL 服务器实例,以您的用户权限运行。这是一个全新的实例,与响应外部请求的实例分开。这个新实例将使用默认配置文件,除非您专门将服务器设置为在每个用户的基础上使用不同的配置文件(配置各不相同,请参阅 http://dev.mysql.com/tech-resources/articles/mysql_intro.html )。

sudo 命令允许用户(具有这样做的权限)以特权 root 帐户而不是当前用户 (sudo man page) 的身份执行命令。当您在此级别执行命令时,您能够与响应外部请求的 mysql 和 apache 的持久实例进行交互。

关于php - 直接在 PHP CLI 和 MySQL 中运行时,数据库查询返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6387273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com