2015-02-24 36 views
0

问题准备语句失败的时候,我改变数据库

所以今天早上我碰到了奇怪的东西时,我正在更新我的数据库。我在我的数据库中执行了排序规则更改,将其从latin1更改为uft8。但是,我的查询突然在我的桌子上失败。经过一些调试,(甚至重建表的原始设置,但没有这样的效果),并收到500内部错误,我意识到它必须与prepared statement,所以我撕掉它,并用一个常规mysqli_query取代它,它令人惊讶地工作。所以现在我想知道,我准备好的声明是否一直是错误的,或者是因为数据库发生了变化而失败。

设置

这是当前表设置。我改回了拉丁(和它的InnoDB的),但它并没有给我的结果后,我想,当我改变了一切回到原来的设置(这是它的现在)

database setup

代码

原代码是这样的,它

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 

    } 

我糊涂一点点(也许我忽略了一些东西在这里因为要专注于代码一点点),但它只是发生在项目表。我对照涉及读数的代码对其进行了检查,并且他们在准备好的语句中都可以正常工作。

希望有人能发现什么,我不能

+2

阅读日志,当你得到500错误。如果不知道错误,没有人能告诉你什么是错的。 – 2015-02-24 14:01:03

+0

查询失败后,尝试回显'mysqli_error()'。 – ToBe 2015-02-24 14:03:14

+2

这是一个很长的过程,但我认为这是原因:mysqli准备声明并且MySQL缓存该声明并返回句柄。接下来发生的事情是,你重新创建表和MySQL **丢失了它的句柄,这导致整个事物引用没有表。这也是为什么常规查询正在工作并且声明不是。从技术上讲,你应该重新连接你的代码(检查你是否使用了持久连接)并告诉MySQL删除缓存并在表被修改后重新准备语句。 – 2015-02-24 14:04:55

回答

0

不会能告诉你发生了什么,但这里有两个想法的。

准备好的语句执行包括两个阶段:prepare和 execute。在准备阶段,将声明模板发送到数据库服务器 。服务器执行语法检查并初始化服务器内部资源供以后使用。

准备好的语句可以重复执行。在每次执行 时,绑定变量的当前值将被评估并发送到 服务器。该语句不再被解析。声明模板 未再次传输到服务器。

也许这就是发生了什么事情,可能是因为准备好的语句在更改为utf8后从未重置。

每个准备好的语句占用服务器资源。使用后应立即关闭声明。如果没有明确地完成,当语句句柄被PHP释放时,该语句将被关闭。

使用准备好的语句并不总是执行语句的最有效的方式 。准备好的语句只执行一次导致 更多的客户端服务器往返比非准备语句。这是 为什么SELECT不作为上面的预处理语句运行。

服务器内存是否已满?

Tekst来自: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

+0

我可以告诉你内存不足,因为除了那些涉及此表的内容以及仅在某些点上的内容外,其他所有查询都能正常工作。例如,我可以改变这个表中的变量的编辑页面也不起作用,但是我预先读取它们的页面确实是这样。它的bizare。 – Dorvalla 2015-02-24 14:29:35

+0

请参阅N.B.的评论。 – 2015-02-24 14:47:16