在 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/