我在以下脚本中遇到问题。通过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
其他信息:
我试图包含所有必要的信息。如果我遗失了任何有用的东西,请告诉我。
答案 0 :(得分:2)
您使用CLI获取的mySQL实例与通过Apache运行查询时的实例不同。
当您连接到shell中的服务器时,您将作为非特权用户(可能是)进行连接。执行any命令时,您可以使用用户帐户的权限执行此操作。
在服务器上运行并响应外部请求的apache和mysql实例正在特权用户下运行。因此,当您连接到shell时,这些实例无法直接与其进行交互 - 它们不属于您的用户。执行mysql...
命令时,操作系统将启动以用户权限运行的mySQL服务器的新实例。这是一个全新的实例,与回答外部请求的实例分开。除非您专门将服务器设置为基于每个用户使用不同的服务器,否则此新实例将使用默认配置文件(配置各不相同,请参阅http://dev.mysql.com/tech-resources/articles/mysql_intro.html)。
sudo
命令允许用户(有权这样做)以特权root帐户而不是当前用户(sudo man page)执行命令。当您在此级别执行命令时,您可以与正在回答外部请求的mysql和apache的持久实例进行交互。