pdo/mysql:使用准备好的语句插入-500(内部服务器错误)

wd2eg0qa  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(365)

我正在用php和mysql编写一个简单的数据库应用程序。我使用ajax在服务器端运行脚本。我用pdo编写了一个数据库类。
我编写了各种php脚本来处理插入数据,它们都使用我的类的“prepare()”和“execute()”方法。
我编写了一个单独的php脚本来创建表和删除表,以及插入示例数据和删除所有数据。这是为了帮助我在构建和调试数据库应用程序时返回一组“已知”的数据。
我在html中创建了四个按钮,我正在异步调用一个php脚本,使用get传递一个名为“script”的变量。在我的脚本中,我有一个switch语句,它决定了要运行的sql命令。没有需要绑定的变量。
当我点击一个按钮来执行一个脚本时,如果情况允许,它可以工作。例如,如果我单击删除所有表,它将删除这些表。但是,如果我再次单击它(并且没有要删除的表),javascript将返回一个500内部服务器错误。我想返回一个错误消息,但无法在脚本中的何处处理此问题。
以下是我的课堂教学方法:

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脚本的关键部分:

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;

按钮之一:

<button type="button" class="btn btn-success" onclick="library('newsql.php?script=create')">Create Tables</button>

我的js:

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();
};

我认为这与prepared语句的标准返回有关,但可能与在不绑定变量的情况下执行prepared语句有关,或者在不更改变量的情况下重复prepared语句有关?

oyt4ldly

oyt4ldly1#

所以你在诊断发生了什么方面有问题。
在js函数中,处理status==200,但不处理错误(比如500)
在浏览器(f12)上打开开发控制台并转到“网络”选项卡,然后单击按钮获取500错误,您将能够看到ajax调用的标题和响应选项卡(请求/响应标题和html/json/任何响应),这是您的php
作为一个500错误的php,您在响应中什么也看不到,那么您的php脚本就没有任何响应,但是您可能会在php或apache的错误日志中看到一些东西。当出现错误时,您必须学会在每次调用时监视这些。然后,您将看到获得调用错误500的确切原因,而不是您在js函数中预期的错误200(确定)。。。
希望有帮助。

相关问题