【问题标题】:PHP form not updating sqlite database [closed]PHP表单不更新sqlite数据库[关闭]
【发布时间】:2015-05-20 11:49:17
【问题描述】:

我有一个 PHP 表单,它应该将一本书添加到 SQLite 数据库中的书籍表中。表单提交了,但是一本书没有添加到我的数据库中。

<?php
session_start();

require("books.php");
require("layout.php");

$db=sqlite_open ("products.db", 0666, $error);

echo $header;
echo "<p>
        <a href='./index.php'>Bookshop</a></p>";
echo "<h1> Add Books </h1>
<p>
<form action='' method='get' id='AddBook'>
  Author: <input type='text' name='Author'><br>
  Title: <input type='text' name='Title'><br>
  Brief_Synopsis: <input type='text' name='Synopsis'><br>
  ISBN_Number: <input type='text' name='ISBN'><br>
  Publisher: <input type='text' name='Publisher'><br>
  imgNumber (save img with this name under /img/): <input type='text' name='imgNum'><br>
  Price: <input type='text' name='Price'><br>
  Category 1: <input type='text' name='Cat1'><br>
  Category 2: <input type='text' name='Cat2'><br>
  <input type='submit' value='Submit' name='Submit'>
</form>
</p>";


if(isset($_POST['Submit'])){
        $author = $_POST['Author'];
$title = $_POST['Title'];
$Synopsis = $_POST['Synopsis'];
$ISBN = $_POST['ISBN'];
$Publisher = $_POST['Publisher'];
$imgNum = $_POST['imgNum'];
$Price = $_POST['Price'];
$Cat1 = $_POST['Cat1'];
$Cat2 = $_POST['Cat2'];
sqlite_query($db,"INSERT INTO Books (Author, Title, Brief_Synopsis, ISBN_Number, Publisher, imgNumber, price, cat1, cat2) VALUES ('$_POST[Author]', '$_POST[Title]', '$_POST[Synopsis]', '$_POST[ISBN]', '$_POST[Publisher]', '$_POST[imgNum]', '$_POST[Price]', '$_POST[Cat1]', '$_POST[Cat2]')"); 
    echo("Book Added!");
$dbh = null;
}
?>

为什么这段代码没有正确更新我的数据库?在我添加 if 语句之前,它每次加载页面时都会向数据库添加一本空书,但是现在它提交并重置表单,我的 URL 看起来正确但数据库没有添加项目。

【问题讨论】:

  • 尝试在 sqlite_query 之前打印 INSERT 查询 - 它显示什么吗?
  • 您的代码静默失败,因为您在表单中使用了 GET 方法,而您使用的是 POST 数组。我应该post 作为答案吗? 请原谅双关语 ;-)
  • 我不太关心sql注入,因为这是一个永远不会连接到互联网的项目,只托管在本地机器上。
  • 不客气。我在下面发布了一个答案,您可以接受关闭。

标签: php forms sqlite submit


【解决方案1】:

您的代码失败了静默,因为您在表单中使用了 GET 方法,而您使用的是 POST 数组。

  • 将表单的方法更改为 POST。

我还需要指出,您当前的代码对SQL injection 开放。使用prepared statementsPDO with prepared statements它们更安全

【讨论】:

    【解决方案2】:

    if 语句检查提交是否存在且不为空。您无法检查输入类型提交,没有关联的值。您可以添加一个隐藏的输入并检查它:

    &lt;input type="hidden" name="checkSubmit" value="Submitted"&gt;

    if(isset($_POST['checksubmit']))

    【讨论】:

    • 这仍然不起作用。它提交,我的 URL 更新为 http://localhost:8800/addBooks.php?Author=test&amp;Title=test&amp;Synopsis=test&amp;ISBN=23232&amp;Publisher=test&amp;imgNum=23&amp;Price=45.99&amp;Cat1=test&amp;Cat2=test&amp;checkSubmit=Submitted&amp;Submit=Submit,但是当我检查数据库时,没有添加任何内容。
    【解决方案3】:

    我还注意到,sql 注入正​​在查看$_POST['myvariable'],这使得之前对变量的检查充其量是多余的。

    【讨论】: