php - 使用 die() 时 SQL 语句中的结果数量不同

标签 php mysql

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

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

整个脚本非常复杂,但运行上面的代码会打印 SQL 语句并提供14 个结果行。 因为我想直接检查数据库,所以我添加了上面的 die()请求后。但这样做,SQL 语句现在仅提供13 个结果行

我知道在执行后切断代码可能会改变系统的状态,因为切断代码中可能的数据库操作将不再生效。但无论是否在运行之前die()无论是否处于事件状态,我总是得到 14 个没有 die() 的结果并且始终有 13 个结果为 die() .

所以我的问题是:每次当我运行没有 die() 的代码时然后直接使用 die() 再次运行代码然后激活,直到 die()语句的代码或数据库状态没有明显的差异,因此 SELECT 语句应该始终提供相同数量的行...但事实并非如此。

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

编辑:

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

Can you program a PHP code including the above snippet which shows the same behavior - so after each run (activated or not) it always delivers 14 Results with the die() deactivated and 13 runs with the die() activated? - of course allowing the sourcecode to analyze itself would be cheating...

编辑2:

我找到了错误的原因。这是因为在开发过程中积累的代码中打印的 PHP 通知和警告在 Firefox 中似乎会导致问题,如果它们达到某个值<head>之前的尺寸部分。 die() case 导致的此类问题较少,因为它会更早中断,而且实际上甚至没有达到 <head> 。如果我静音,会注意到两个示例的行为相同。到底是什么导致了错误,然后我还没有检查过...抱歉,我在描述我的问题时没有暗示错误报告,但我不知道这可能是原因 - 特别是因为它在两种情况下都处于事件状态。 ...

最佳答案

不是答案,只是我所说的“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) 测试了该脚本。

关于php - 使用 die() 时 SQL 语句中的结果数量不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31385565/

相关文章:

php - 最多 24 小时更新数据库

mysql - 如何写一个SQL查询来解决8皇后的问题?

php - 对于 Blade @sections 周围的每个循环是否有可能

php - 使用 PHP 和 AJAX 的链表

javascript - 文本区域值不保留变量的换行符

php - 即使使用 LIMITS,Mysql 查询也需要很长时间

mysql chef 数据库配方在大文件上失败

php - 用jQuery乘以数据查询的结果

mysql - 如何通过另一个表中的相似数据更新sql中的列

php - 未定义 jQuery 字符串