【发布时间】:2021-04-12 18:15:36
【问题描述】:
上下文
我刚刚将我的网站服务器升级到 VPS,并且自从将我的文件移动到新服务器后,在转换时遇到了一些问题。其中之一是,在这台服务器上,我的一个功能运行不正常。函数getRandomArticles() 从我的 mySQL 数据库中获取用户发布的文章。在我的本地服务器和我以前的共享服务器上,它运行良好。但是,当我在 VPS 上运行以下函数时,我收到错误 parserror 和
SyntaxError: Unexpected end of JSON input at parse (<anonymous>) at VM3130
jquery.min.js:2 at l (VM3130 jquery.min.js:2) at XMLHttpRequest.<anonymous>
(VM3130 jquery.min.js:2)
(来自错误回调函数中的console.log(error)和console.log(errorThrown))
这是返回错误的函数getRandomArticles():
var ids = [];
function getRandomArticles() {
$.ajax({
url: 'includes/articles/getRandomArticles.php',
type: 'GET',
dataType: 'json',
success: function(data) {
//code irrelevant to problem
},
error: function(requestObject, error, errorThrown) {
console.log(error);
console.log(errorThrown);
}
});
}
这是我的 PHP 代码:
<?php
include '../dbh.inc.php';
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
$q = "SELECT articles.article_id, articles.title, articles.article, articles.idUsers, users.uidUsers, articlecoverimages.image, profileimages.image AS profileImage
FROM articles
JOIN users
JOIN articlecoverimages
JOIN profileimages ON users.idUsers = articlecoverimages.idUsers AND articles.article_id = articlecoverimages.article_id AND profileimages.idUsers = users.idUsers
WHERE articles.published = ? AND articles.approved = 1
ORDER BY RAND()
LIMIT 5";
$stmt = mysqli_prepare($conn, $q);
mysqli_stmt_bind_param($stmt, 's', $published);
$published = "yes";
mysqli_stmt_execute($stmt);
$r = mysqli_stmt_get_result($stmt);
if ($r) {
if (mysqli_num_rows($r) == 0) {
$data['error'] = "";
$results[] = $data;
} else {
while ($row = mysqli_fetch_array($r)) {
$data['articleId'] = $row['article_id'];
$data['title'] = $row['title'];
$data['article'] = strip_tags(htmlspecialchars_decode($row['article'], ENT_QUOTES));
$data['idUsers'] = $row['idUsers'];
$data['uidUsers'] = $row['uidUsers'];
$data['image'] = $row['image'];
$data['profileImage'] = $row['profileImage'];
$results[] = $data;
}
}
echo json_encode($results);
}
mysqli_stmt_close($stmt);
mysqli_close($conn);
}
发生这些错误时,PHP 代码没有响应。如果没有错误,它会使用 JSON 数组进行响应。但是,当我回显特定行(例如echo $row['article'];)时,即使出现错误,该特定数据也会发送。因此,在这种情况下,只会返回文章的名称。
当我多次刷新页面时,代码终于可以正常工作并加载文章数据。然而,这只在大约 30-40% 的时间里有效,似乎是随机的。
我尝试过的事情
我使用echo json_encode($results) 来返回 AJAX 调用指向的 PHP 文件的值,所以我在这里使用 JSON。当我只是说echo $results[] 时,有一个错误,当我从 AJAX 参数中删除 dataType: json 时,也有一个错误(以防它们具有解决问题的任何合法潜力)。
问题
知道这个函数有什么问题吗?
更新
我发现当我删除线时
$data['article'] = strip_tags(htmlspecialchars_decode($row['article'], ENT_QUOTES));
所有其他行在 PHP 文件中返回。当我删除除上一行之外的所有其他行时,错误仍在继续。每次。所以,删除
$data['article'] = strip_tags(htmlspecialchars_decode($row['article'], ENT_QUOTES));
修复了这个问题,除了我需要能够返回这一行,它给出了文章内容本身。我对获取文章内容的其他三个文件也有同样的问题,所有这些文件都有相同的行(并且所有这些文件都通过删除该行来修复)。不过,这很奇怪,因为其他指定文章主题的文件能够很好地获取文章内容。我已经尝试在我的 VPS 上重置所有内容;数据库,apache服务器,我能做的一切,都无济于事。根据这一发现,似乎 PHP 文件是这里的问题,但似乎没有解决问题的潜在解决方案。同样,该文件在我的本地服务器上运行良好,在我以前的共享服务器上运行良好,但在这个新服务器上,它有问题。我什至删除了文件并制作了新文件,以查看文件本身是否导致任何类型的错误,这也不起作用。
另外,如前所述,虽然
$data['article'] = strip_tags(htmlspecialchars_decode($row['article'], ENT_QUOTES))
当我删除echo json_encode($results) 和存储在$results 数组中的所有其他列值并简单地回显$row['article'] 时(像这样):
while ($row = mysqli_fetch_array($r)) {
echo strip_tags(htmlspecialchars_decode($row['article'], ENT_QUOTES));
}
文章内容返回。知道为什么会出现这个问题吗?
这是文章数据库中“文章”列的结构:
article TEXT NOT NULL
【问题讨论】:
-
收到错误时的响应是什么?
-
@Nick 发生错误时没有响应。但是,当我从数据库中回显特定行时,例如
echo $row['article'],尽管出现错误,仍会返回文章。如果这没有意义,请告诉我。 -
如果在
if测试之前初始化$results = array('test');会发生什么,您仍然没有得到响应吗? -
@Nick 是的,如果我这样做,我仍然没有得到任何回应。
-
抱歉,意思是说在
if语句之后也需要echo json_encode($results);