可以读取但不能 Create/Update 使用 PHP MySQLi
Can Read but can't Create/Update using PHP MySQLi
我已经成功地从 php 脚本通过客户端 ajax 和使用 chromium 的本地主机执行了服务器端数据库读取 (SELECT) 请求在 Linux 虚拟机上。数据按预期返回,这里没有问题。
按照相同的过程,我尝试同时发出 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-data 添加到 osboxes 组
sudo usermod -a -G www-data osboxes
将 osboxes 添加到 www-data 组(为了更好的衡量,两种方式都做了)。
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')
现在您已经创建了另外三行。可以用这种方式做更糟糕的事情。
有关详细信息,请参阅 this question。
我已经成功地从 php 脚本通过客户端 ajax 和使用 chromium 的本地主机执行了服务器端数据库读取 (SELECT) 请求在 Linux 虚拟机上。数据按预期返回,这里没有问题。
按照相同的过程,我尝试同时发出 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-data 添加到 osboxes 组
sudo usermod -a -G www-data osboxes
将 osboxes 添加到 www-data 组(为了更好的衡量,两种方式都做了)。
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')
现在您已经创建了另外三行。可以用这种方式做更糟糕的事情。
有关详细信息,请参阅 this question。