【问题标题】:PHP won't interface with MySQL in Apache on Raspberry Pi在 Raspberry Pi 上的 Apache 中 PHP 不会与 MySQL 交互
【发布时间】:2017-07-19 22:01:00
【问题描述】:

几天前,我在我的 Raspberry Pi 2 Model B+ 上安装了 MySql,看看我是否可以使用它、PHP、phpmyadmin 和 Apache 来创建一个可访问的数据库来组织和分类家里的书籍。我在 MySQL 数据库中有一个表,该表设置为具有三列的原型;书号(设置为自动递增)、书名和作者姓氏。我正在尝试在数据库 bookProof 中使用表单将书籍插入表 beta 中。 这是表单的代码:

<html>
<body>

<form action="catalog.php" method="POST">
<p>Book Title: <input type="text" name="title"></p>
<p>Author's Last Name: <input type="text name="authorlastname"></p>
</form>

</body>
</html>

其中链接到“catalog.php”,即:

<?php

define('DB_NAME', 'bookProof');
define('DB_USER', 'root');
define('DB_PASSWORD', 'root');
define('DB_HOST', 'localhost');

$conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if ($conn->connect_error) {
    die("Could not connect: " . $conn->connect_error);
}

$value = $_POST["title"]
$value2 = $_POST["authorlastname"]


$sql = "INSERT INTO beta ('title', 'authorLastName') VALUES ('".$value."', '".$value2."')"

$query = mysqli_query($conn,$sql);

if ($conn->($sql) === TRUE) {
    echo "New entry completed successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();
?>

打开demoform.php时功能正常,但是点击“添加图书”按钮时,按预期进入catalog.php,但是catalog.php页面是空白的,表格没有变化,谷歌Chrome 的“检查”工具给出了错误:

POST http://192.168.254.11/Library/catalog.php 500 (Internal Server Error)     catalog.php:1

如果有人知道如何获取数据库的输入,请告诉我。

注意:这只是一个家庭系统,因此安全不是优先事项(我不需要 SQL 代码注入保护)。

【问题讨论】:

  • 这听起来像是 Apache 配置错误,代码 500 是服务器端错误。您在 catalog.php 页面上是否有任何 .htaccess 规则?
  • 这一行缺少一个双引号。已更正 ->
  • @mayur beldar 我正在使用 VNC 连接来访问我的 Raspberry Pi,因此我不得不再次输入整个代码,而不是在此处复制/粘贴。代码在实际服务器上是正确的。
  • @elzo Valugi 我在该页面上没有任何 .htaccess 规则。我是否需要为此页面的功能实现这些功能?如果是这样,您能否提供有关如何做到这一点的资源和资源?感谢您的宝贵时间。
  • 警告:使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug切勿$_POST$_GET任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。

标签: php mysql database apache


【解决方案1】:

您的注释,“...安全不是优先事项(我不需要 SQL 代码注入保护)” - 您可能会这么认为,但无论如何您都应该这样做。如果您的系统被公开(或稍后公开),它不仅可以保护您的数据库,它还会自动为您处理字符串,因此如果您的字符串中包含引号',您的查询不会中断。

一个问题是您在列名和表名周围使用单引号。这应该是反引号,或者根本没有。然后,在定义 $value$value2$sql 字符串后,您缺少分号 ;

然后你做了一些奇怪的事情——这也导致了一个解析错误(如果你启用了错误报告并检查了你的日志,你会看到一个“解析错误:语法错误,意外( ”错误),您正在使用 mysqli_query() 查询表,但随后您尝试再次执行此操作 - 除非您尝试查询查询字符串,而不是查询方法。请注意我在下面的代码中添加的 cmets。

// Don't use singlequotes ' for columns and table-names
// Use backticks ` - quotes are for strings 
$sql = "INSERT INTO beta (`title`, `authorLastName`) VALUES ('".$value."', '".$value2."')"; // You were also missing a semicolon here!

// $query = mysqli_query($conn,$sql); // Remove this line, as you're attempting to query it twice 

if ($conn->query($sql) === TRUE) { // You're missing the query() method here
    echo "New entry completed successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

使用准备好的语句不会有太大的不同,你真的应该这样做。绝对没有理由不使用准备好的语句!看看有多么小的改变!

$sql = "INSERT INTO beta (title, authorLastName) VALUES (?, ?)";

if ($stmt = $conn->prepare($sql)) { 
    $stmt->bind_param("ss", $value, $value2);
    $stmt->execute();
    $stmt->close(); 
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

您还有一些无效的 HTML,这会导致问题 - 以下行缺少引号以关闭 type 属性。

<input type="text" name="authorlastname">

我建议你阅读以下文档和文章

作为最后一点,您应该在将表单插入数据库之前检查表单是否已提交并且它是否具有值。此外,使用像 $value$value2 这样的变量名并不是真正的描述性 - 你应该避免它并为你的变量使用正确的名称。

【讨论】:

  • 为了发展我的知识,“绝对没有理由不使用准备好的语句”-> 有。无法使用多个命名参数。此外,我确实发现很难开发/调试/改进具有命名或未命名参数的查询,因为我必须替换文本。使用 sqp 变量 (@) 我可以简单地在查询中覆盖它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多