gpt4 book ai didi

php - PDO/MySQL : Inserting with a prepared statement - 500 (Internal Server Error)

转载 作者:行者123 更新时间:2023-11-29 18:02:01 26 4
gpt4 key购买 nike

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

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

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

我在 html 中创建了四个按钮,并且异步调用 php 脚本,使用 GET 传递一个名为“script”的变量。在我的脚本中,我有一个 switch 语句,它确定要运行的 SQL 命令。没有我需要绑定(bind)的变量。

当我单击按钮来执行脚本时,它会起作用 - 如果情况允许的话。因此,例如,如果我单击删除所有表,它将删除这些表。但是,如果我再次单击它(并且那里没有要删除的表),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();
};

我认为这与准备好的语句的标准返回有关,但也许这与执行准备好的语句而不绑定(bind)变量,或者重复准备好的语句而不更改变量有关?

最佳答案

所以你在诊断正在发生的事情时遇到了问题。

  • 在 JS 函数中,您正在处理 status == 200,但没有处理任何错误(例如 500)
  • 在浏览器 (F12) 中打开开发控制台并转到“网络”选项卡,然后单击按钮以获取 500 错误,您将能够看到 ajax 调用的 header 和响应选项卡(请求/response header 和 html/json/whatever 响应)即您的 PHP
  • 如果 PHP 出现 500 错误,并且您在响应中看不到任何内容,那么您的 PHP 脚本不会回显任何内容,但您可能会在 PHP 或 Apache 的错误日志中看到一些内容。您必须学会在出现错误 500 时监控每次调用。然后您将看到您的调用收到错误 500 的确切原因,而不是您在 JS 函数中期望的 200(正常)...

希望有帮助。

关于php - PDO/MySQL : Inserting with a prepared statement - 500 (Internal Server Error),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48253108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com