可以读取但不能 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