使用die()

时间:2015-07-13 14:04:17

标签: php mysql

在PHP脚本中,我执行MySQL请求,其中$SQL是一个硬编码的SQL-SELECT语句:

$Result = mysqli_query($server,$SQL);
echo '<br>'.$SQL.'*'.mysqli_num_rows($Result);
#die('test');

整个脚本非常复杂,但运行上面的代码会打印出SQL-Statement并提供 14 Result rows 。 由于此时我想直接检查数据库,因此我在请求后添加了上述die()。但是这样做,SQL-satement现在只提供 13个结果行

我知道在执行后切割代码可能会改变系统的状态,因为切断代码中的可能数据库操作将不再生效。但无论是否在die()处于活动状态之前,我总是在没有die()的情况下获得14个结果,而在die()时总是获得13个结果。

所以我的问题是:每次当我运行没有die()的代码时,然后直接运行代码并激活die(),直到{{1语句在数据库的代码或状态方面没有明显的区别,因此SELECT语句应始终提供相同数量的行...但它不会。

任何人都可以想到一个让这种行为可以理解的设置吗?我希望我的解释不是很奇怪 - 否则我很乐意回答任何问题。显然有一个简单的解释,我似乎只想念......

修改

我遇到的问题可能是我隐藏在大量代码中的错误。这肯定很难回答,特别是如果你没有完整的代码。但是,如果我将我的问题重新表述为以下任务,那可能会有所帮助:

  

你能编写一个PHP代码,包括上面显示相同行为的代码片段 - 所以每次运行(激活与否)后,它总是提供14个结果,die()停用,13个运行die()激活? - 当然允许源代码分析自己会作弊......

编辑2:

我找到了错误的原因。这是因为在开发过程中积累的代码中打印PHP通知和警告,如果它们达到某个特定目的,那么在Firefox中会出现问题die()部分之前的大小。 <head>案例导致的情况较少,因为它早先中断,实际上甚至没有达到die()。如果我静音通知,两个示例的行为都相同。究竟是什么导致错误然后我没有检查...抱歉我在描述我的问题时没有暗示错误报告,但我不知道这可能是原因 - 特别是因为它在两种情况下都是活跃的。 ...

1 个答案:

答案 0 :(得分:0)

不是答案,只是“simple, self-contained (,correct) example”的一个例子。

<?php
$server = setup();
$SQL = 'SELECT id,x,y,z FROM soFoo';
$Result = mysqli_query($server,$SQL);
echo '<br>'.$SQL.'*'.mysqli_num_rows($Result);
#die('test');

function setup() {
    $server = new mysqli('localhost', 'localonly', 'localonly', 'test');
    if ( $server->connect_errno ) {
        die('!'.$server->connect_error);
    }

    $server->query('CREATE TEMPORARY TABLE soFoo (
            id int auto_increment,
            x char(255),
            y char(255),
            z char(255),
            primary key(id) 
        )
    ') or die('!'.$server->error);

    $stmt=$server->prepare('INSERT INTO soFoo (x,y,z) VALUES (?,?,?)')
        or die('!'.$server->error);

    $stmt->bind_param('sss', $x, $y, $z) or die('!'.$stmt->error);
    foreach( range('a','n') as $x) { // fill in 14 records
        $z = $y = $x;
        $stmt->execute() or die('!'.$stmt->error);
    }
    return $server;
}

你只需要复制并粘贴它,调整MySQL连接数据(凭据,主机,数据库)然后再运行它。

在我的情况下,它按预期打印<br>SELECT id,x,y,z FROM soFoo*14(因为setup()函数向临时表添加了14条记录),无论die()是否存在。因此,此示例的行为与您的描述不同,但它包含您提供的信息(以及代码段)。你身边必须有所不同。
我用php5.6.10(win32)和MySQL 5.6.22-log(win32)测试了脚本。