所以今天早上我碰到了奇怪的东西时,我正在更新我的数据库。我在我的数据库中执行了排序规则更改,将其从latin1
更改为uft8
。但是,我的查询突然在我的桌子上失败。经过一些调试,(甚至重建表的原始设置,但没有这样的效果),并收到500内部错误,我意识到它必须与prepared statement
,所以我撕掉它,并用一个常规mysqli_query
取代它,它令人惊讶地工作。所以现在我想知道,我准备好的声明是否一直是错误的,或者是因为数据库发生了变化而失败。
设置
这是当前表设置。我改回了拉丁(和它的InnoDB的),但它并没有给我的结果后,我想,当我改变了一切回到原来的设置(这是它的现在)
代码
原代码是这样的,它
require_once '../db/dbControl.php';
$id = mysqli_real_escape_string($con,$_GET["id"]);
$sql = "SELECT *
FROM project
WHERE project.ProjectId = ? ";
$stmt1 = mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt1,'i',$id);
mysqli_stmt_execute($stmt1);
mysqli_stmt_bind_result($stmt1,$ProjectId,$ProjectTitel,$ProjectOmschrijving, $ProjectOmschrijving,$ProjectDatum,$ProjectClient,$ProjectUrl);
while (mysqli_stmt_fetch($stmt1)){
the code itself of the page
}
所以现在我只是使用普通的mysqli_query
,以使其正常工作的工作,直到变化
require_once '../db/dbControl.php';
id = mysqli_real_escape_string($con,$_GET["id"]);
$sql = "SELECT *
FROM project
WHERE project.ProjectId = '". $id ."'";
$result = mysqli_query($con,$sql);
while($rows=mysqli_fetch_array($result)){
$ProjectId = $rows['ProjectId'];
$ProjectTitel = $rows['ProjectTitel'];
$ProjectExpertise = $rows['ProjectExpertise'];
$ProjectOmschrijving = $rows['ProjectOmschrijving'];
$ProjectDatum = $rows['ProjectDatum'];
$ProjectClient = $rows['ProjectClient'];
$ProjectUrl = $rows['ProjectUrl'];
the code itself of the page
}
我糊涂一点点(也许我忽略了一些东西在这里因为要专注于代码一点点),但它只是发生在项目表。我对照涉及读数的代码对其进行了检查,并且他们在准备好的语句中都可以正常工作。
希望有人能发现什么,我不能
阅读日志,当你得到500错误。如果不知道错误,没有人能告诉你什么是错的。 – 2015-02-24 14:01:03
查询失败后,尝试回显'mysqli_error()'。 – ToBe 2015-02-24 14:03:14
这是一个很长的过程,但我认为这是原因:mysqli准备声明并且MySQL缓存该声明并返回句柄。接下来发生的事情是,你重新创建表和MySQL **丢失了它的句柄,这导致整个事物引用没有表。这也是为什么常规查询正在工作并且声明不是。从技术上讲,你应该重新连接你的代码(检查你是否使用了持久连接)并告诉MySQL删除缓存并在表被修改后重新准备语句。 – 2015-02-24 14:04:55