【问题标题】:How to write AJAX code to print PHP error to alert() box?如何编写 AJAX 代码以将 PHP 错误打印到 alert() 框?
【发布时间】:2016-11-12 15:54:27
【问题描述】:

这原本是一个关于PHP的问题,我将PHP问题编辑如下:

我在这个网站上找到的 AJAX 代码旨在将错误消息放在一个一直有效的警告框中。抱歉,如果有些错误很明显,只是在这方面工作太多了。

PHP:

<?php
include 'pdo_connect.php';

error_reporting(E_ALL);
ini_set('display_errors', 1);


if ($uname = isset($_POST['uname']) ? $_POST['uname'] : ''){
$conn = new PDO('mysql:host=localhost;dbname=users', USER, PASS);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = 'SELECT * FROM `users` WHERE `uname` = :uname';
$stmt = $conn->prepare($query);
$stmt->bindParam(":uname",$uname, PDO::PARAM_STR, strlen($uname));

$rows = $stmt->fetch(PDO::FETCH_ASSOC, 0);
echo json_encode($rows);
echo json_encode("It works!");

$stmt->execute();



$conn = null;
$query = null;
}
?>

AJAX:

function checkName() {
$.ajax({
url: "check_name.php",
data: {uname: $('#uname').val(), upassword: $('#upassword').val()},
type: "POST",
dataType:"text"
})
function reqListener () {
  console.log(this.responseText);
};

var oReq = new XMLHttpRequest(); 
oReq.onload = function() {

    alert(this.responseText); 
};
oReq.open("post", "check_name.php", true);

oReq.send();

};

这正是我的代码在 JavaScript 文件中的样子。我在文件中还有其他几个函数,所以我不认为我的 JavaScript 文件是罪魁祸首。

【问题讨论】:

  • 先看看教程怎么样?
  • 您将命名参数与?
  • 我改变了很多次方法,我一定把它们弄混了——谢谢。

标签: mysql ajax pdo


【解决方案1】:

试试

$sth = $conn->prepare($stmt);

之前

$stmt->bindParam(':uname', $uname, PDO::PARAM_STRING);

此外,如果存在错误,请在执行()查询后使用以下代码转储 PDO 错误数据(未经测试,但要点是正确的。请参阅 PDOStatement::errorCode() 和 PDOStatement::errorInfo())

if($stmt->errorCode() !== "00000") {
    var_dump($stmt->errorInfo())
}

【讨论】:

  • 如果启用异常模式,检查errorInfo没有意义
  • 你是对的。另外,我认为您绑定不正确。您的查询中没有 ':uname' 参数。用这个替换你的绑定代码并试一试: $stmt->bindParam(1, $uname, PDO::PARAM_STRING);
  • 仍然没有错误,我觉得这很明显,但没有足够的经验来解决这个问题 - 谢谢。
  • 根据文档,如果您使用问号占位符。像这样绑定:$sth-&gt;bindParam(1, $uname, PDO::PARAM_STRING, strlen($uname));
  • 好吧,在萤火虫中,这为未定义的类常量 PARAM_STRING 提供了一个错误,我将其视为 PARAM_STR - 顺便说一句,javascript 正在发送值。我也会查看文档。
【解决方案2】:

这个:

$stmt = 'SELECT * FROM users WHERE uname = ?';

是一个字符串。它没有名为bindParam 的方法。您需要先准备语句,然后像这样将变量绑定到它:

$query= 'SELECT * FROM users WHERE uname = ?';
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $uname);

这将返回一个 PDOStatement 类型的对象,该对象具有您可以调用的 bindParam 方法

如果你想使用 ':uname' 你需要在查询中指定它。如果您使用问号占位符,则必须使用 bindParam 中的数字。使用文本占位符,您可以这样做:

$query= 'SELECT * FROM users WHERE uname = :uname';
$stmt = $conn->prepare($query);
$stmt->bindParam(':uname', $uname);

查看this关于 PHP PDO Prepared statements 的教程了解更多信息。

【讨论】:

  • 这也没有返回错误。我认为,由于 Firebug 表明服务器没有返回任何内容,要么是我的查询错误,要么是 ajax 调用不正确。
  • @user6571726 你检查过服务器的错误日志吗?
  • 是的,最后说的是cannot pass parameter by reference,指的是$stmt-&gt;bindParam($uname, PDO::PARAM_STR, strlen($uname));的parameter 2
  • @user6571726 试试bindValue(1, $uname);。如果失败,则表明您的 AJAX 请求有问题,$uname 最终会出现 null
  • 我觉得你说得对,我也是ajax初学者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 2023-03-28
  • 2012-01-29
  • 1970-01-01
  • 2017-02-28
相关资源
最近更新 更多