当我更改数据库时,Prepared语句失败

时间:2015-02-24 13:26:20

标签: php mysql database

问题

所以今天早上我更新数据库时遇到了一些好奇。我在数据库中执行了排序规则更改,将其从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

  }

我有点困惑(也许我在这里忽略了一些因为专注于一些代码)但它只发生在项目表上。我根据涉及读数的代码检查了它,并且它们在准备好的语句中都可以正常工作。

希望任何人都能发现我无法做到的事情

1 个答案:

答案 0 :(得分:0)

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

  

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

     

准备好的陈述可以重复执行。每次执行   绑定变量的当前值被计算并发送到   服务器。该语句不会再次解析。声明模板是   没有再转移到服务器。

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

  

每个预准备语句都占用服务器资源。声明应在使用后立即明确关闭。如果没有显式完成,则在PHP释放语句句柄时将关闭该语句。

     

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

也许服务器内存(是/是)已满?

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

相关问题