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

时间:2011-06-17 14:22:36

标签: php mysql

我在以下脚本中遇到问题。通过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
  4. 我试图包含所有必要的信息。如果我遗失了任何有用的东西,请告诉我。

1 个答案:

答案 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的持久实例进行交互。