在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()
。如果我静音通知,两个示例的行为都相同。究竟是什么导致错误然后我没有检查...抱歉我在描述我的问题时没有暗示错误报告,但我不知道这可能是原因 - 特别是因为它在两种情况下都是活跃的。 ...
答案 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)测试了脚本。