可以使用 PHP MySQLi 读取但不能创建/更新



我已经成功地通过客户端的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')

现在您已经创建了另外三行。还有更糟糕的事情可以这样做。

有关详细信息,请参阅此问题。

相关内容

  • 没有找到相关文章