【问题标题】:Can Read but can't Create/Update using PHP MySQLi可以读取但不能使用 PHP MySQLi 创建/更新
【发布时间】:2021-04-15 08:14:57
【问题描述】:

我已经成功地通过客户端的 ajax 和在 Linux 虚拟机上使用 chromium 的本地主机从 php 脚本执行了服务器端数据库读取 (SELECT) 请求。数据按预期返回,这里没有问题。

按照相同的过程,我尝试发出 CREATE 和 UPDATE 请求,但没有任何反应。从我所看到的字面上看,什么都没有。 apache 日志中没有错误。数据库保持不变。如果我在 AJAX 调用后使用 .then(),则 Javascript 不会继续执行。

在下面的代码中,我把问题归结为一行代码:$result = $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-data 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

【问题讨论】:

  • 您的查询中有语法错误。您需要将您的值用引号括起来:VALUES ('" . $name . "')";。请注意,以这种方式构建查询容易受到 SQL 注入的影响。你应该转向准备好的陈述。见this question
  • 我不敢相信这一直是问题...解决方案对我来说甚至都不正确,因为它将变量转换为字符串?不管怎样,它有效,我觉得很愚蠢。非常感谢......请把它作为答案,我很乐意将其标记为这样。
  • 如果我一开始就知道我在寻找什么,那将会有。在后站点中,建议的线程非常有用,我将来可能会使用它。但是,我可能花了很长时间才找到它。不同意这篇文章表明缺乏研究努力。有时您只需要伸出援助之手就可以开始提出正确的问题。

标签: php linux mysqli virtual-machine lamp


【解决方案1】:

在这些行中,您正在构建 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

【讨论】:

  • 再次感谢您。这不仅解决了我的问题,还解决了一个即将发生的直接问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
相关资源
最近更新 更多