我已经成功地通过客户端的ajax和Linux虚拟机上使用chrome的本地主机从php脚本执行了服务器端数据库读取(SELECT(请求。数据按预期返回,此处没有问题。
通过遵循相同的过程,我尝试了同时发出CREATE和UPDATE请求,但什么也没发生。从我所看到的一切来看,根本没有什么。apache日志中没有错误。数据库保持不变。如果在AJAX调用后使用.then((,Javascript将不会继续执行。
在下面的代码中,我将问题归结为一行代码:$result = $conn->query($query);
奇怪的是,如果我将$result设置为一个字符串(例如$result = "hi";
(,并将$conn->query($query);
保留在单独的一行上,则代码请求被认为是成功的,javascript将恢复.then((块。
这是我的PHP代码。
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
$executionStartTime = microtime(true);
include("config.php");
header('Content-Type: application/json; charset=UTF-8');
$conn = new mysqli($cd_host, $cd_user, $cd_password, $cd_dbname, $cd_port, $cd_socket);
if (mysqli_connect_errno()) {
$output['status']['code'] = "300";
$output['status']['name'] = "failure";
$output['status']['description'] = "database unavailable";
$output['status']['returnedIn'] = (microtime(true) - $executionStartTime) / 1000 . " ms";
$output['data'] = [];
mysqli_close($conn);
echo json_encode($output);
exit;
}
$name = "test";
$query = "INSERT INTO location (name) VALUES (" . $name . ")";
$result = $conn->query($query);
if (!$result) {
$output['status']['code'] = "400";
$output['status']['name'] = "executed";
$output['status']['description'] = "query failed";
$output['data'] = [];
mysqli_close($conn);
echo json_encode($output);
exit;
}
$output['status']['code'] = "200";
$output['status']['name'] = "ok";
$output['status']['description'] = "success";
$output['status']['returnedIn'] = (microtime(true) - $executionStartTime) / 1000 . " ms";
$output['data'] = [];
mysqli_close($conn);
echo json_encode($output);
?>
我的apache2错误日志中的最后一个错误如下,并且已经修复。这是我收到或能找到的最后一条有用的信息:
[Sat Jan 09 19:08:53.816594 2021] [proxy_fcgi:error] [pid 6970] [client 127.0.0.1:39884] AH01071: Got error 'PHP message: PHP Notice: Undefined variable: result in /var/www/html/php/insertLocation.php on line 27', referer: http://127.0.0.1/
我在终端中使用了以下命令,以防与权限有关。
将www数据添加到osboxes组sudo usermod -a -G www-data osboxes
将osboxes添加到www数据组(两种方法都做了(。sudo usermod -a -G osboxes www-data
将osboxes(用户(设置为拥有www数据sudo chown -R osboxes:www-data /var/www/html
sudo chgrp -R www-data /var/www/html
设置apache的访问权限sudo chmod 777 -R /var/www/html
ls -al /var/www/html
终端输出
total 36
drwxrwsrwx 7 www-data www-data 4096 Dec 28 13:46 .
drwxr-xr-x 3 root root 4096 Dec 22 10:11 ..
drwxrwsrwx 4 osboxes www-data 4096 Dec 29 09:49 css
-rwxrwxrwx 1 osboxes www-data 5599 Jan 5 18:11 index.html
drwxrwsrwx 4 osboxes www-data 4096 Dec 28 13:46 js
drwxrwsrwx 3 osboxes www-data 4096 Dec 28 13:52 libs
drwxrwsrwx 2 osboxes www-data 4096 Jan 9 17:46 php
drwxrwsrwx 2 osboxes www-data 4096 Dec 21 12:05 sql
在这些行中,您正在构建一个SQL查询:
$name = "test";
$query = "INSERT INTO location (name) VALUES (" . $name . ")";
您正在创建的查询将是:
INSERT INTO location (name) VALUES (test)
这将失败,因为SQL语法需要在字符串数据周围加引号,所以您需要创建
INSERT INTO location (name) VALUES ('test')
为此,您需要
$query = "INSERT INTO location (name) VALUES ('" . $name . "')";
^ ^
Quotes here
这是一种创建SQL查询的危险方法。如果你收到的数据包含一个引号,它会终止字符串,如果幸运的话,你只会得到一个语法错误:
INSERT INTO location (name) VALUES ('O'Leary')
但假设有人制作了一个特殊的字符串,比如','test1','test2','test3
。您的查询变成了
INSERT INTO location (name) VALUES (' ','test1','test2','test3')
现在您已经创建了另外三行。还有更糟糕的事情可以这样做。
有关详细信息,请参阅此问题。