首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDO/MySQL:用准备好的语句插入- 500 (内部服务器错误)

PDO/MySQL:用准备好的语句插入- 500 (内部服务器错误)
EN

Stack Overflow用户
提问于 2018-01-14 19:02:12
回答 1查看 1.3K关注 0票数 0

我正在用PHP和MySQL编写一个简单的数据库应用程序。我正在使用ajax运行脚本服务器端。我使用PDO编写了一个数据库类。

我编写了各种php脚本来处理插入数据,它们都使用我们类的“pre准备()”和"execute()“方法。

我编写了一个单独的php脚本来创建表和删除表,并插入示例数据和删除所有数据。这是为了帮助我在构建和调试数据库应用程序时返回“已知”数据集。

我已经在html中创建了四个按钮,并且我正在缓慢地调用一个php脚本,使用GET传递一个名为" script“的变量。在我的脚本中,我有一个开关语句,它决定要运行的SQL命令。我不需要绑定任何变量。

当我单击一个按钮来执行一个脚本时,如果情况允许的话,它可以工作。因此,例如,如果我单击删除所有表,它将删除这些表。但是,如果我再次单击它(并且没有要删除的表),javascript将返回一个500 -内部服务器错误。我想返回一个错误消息,但无法确定在我的脚本中处理这个错误的位置。

以下是我的课堂方法:

代码语言:javascript
复制
public function prepare($query){
  // PDO prepare allows for binding of values, removes threat of SQL injection and improves query performance
  $this->statement = $this->connection->prepare($query);
}

public function bind($parameter, $value, $type = null){
  // PDO bindValue binds inputs to placeholders
  if(is_null($type)){
    switch(true){
      case is_int($value):
        $type = PDO::PARAM_INT;
        break;
      case is_bool($value):
        $type = PDO::PARAM_BOOL;
        break;
      case is_null($value):
        $type = PDO::PARAM_NULL;
        break;
      default:
        $type = PDO::PARAM_STR;
    }
  }
  $this->statement->bindValue($parameter, $value, $type);
}

public function execute(){
  // Executes the prepared statement
  return $this->statement->execute();
}

public function allresults(){
  // Returns all results
  $this->execute();
  return $this->statement->fetchAll(PDO::FETCH_ASSOC);
}

下面是使用ajax调用php脚本的关键部分:

代码语言:javascript
复制
switch ($script) {
  case "create":
      global $create_tables;
      global $database;
      $database->prepare($create_tables);
      $result = $database->execute($create_tables);
      if($result){
        echo "Success";
      }
      else{
        echo "Failed";
      }
      break;

其中一个按钮:

代码语言:javascript
复制
<button type="button" class="btn btn-success" onclick="library('newsql.php?script=create')">Create Tables</button>

我的js:

代码语言:javascript
复制
function library(path) {


xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
          document.getElementById("main").innerHTML = this.responseText;
      }
  };
  xmlhttp.open("GET",path,true);
  xmlhttp.send();
};

我认为这与准备语句的标准返回有关,但可能与执行准备好的语句而不绑定变量有关,还是重复准备好的语句而不更改变量?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-14 19:15:59

所以你在诊断发生了什么方面有问题。

  • 在JS函数中,您正在处理状态== 200,但是没有错误(比如500)。
  • 在浏览器(F12)上打开您的开发控制台,在单击按钮获取500个错误之前进入“网络”选项卡,您将能够看到ajax调用的标题和响应选项卡(请求/响应头和html/json/任何响应),这是您的PHP。
  • 作为PHP中的500个错误,而您在响应中没有看到任何错误,那么PHP脚本就没有响应,但是您可能会在PHP或Apache的错误日志中看到一些东西。当出现错误500时,您必须学会在每次调用时监视这些调用。然后,您将看到您为您的调用获得错误500的确切原因,而不是在JS函数中期望的200 (OK) .

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48253108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档