【问题标题】:Cannot insert into SQLite database through php PDO无法通过 php PDO 插入 SQLite 数据库
【发布时间】:2011-01-08 16:18:13
【问题描述】:

请帮忙看看有什么问题......(我测试了数据库连接是好的)

<?php
$user_name=$_POST['user_name'];
$password=$_POST['password'];

$dbh=new PDO('sqlite:./db/user.db') or die("fail to connect db");

try{
 $stmt = $dbh->prepare("INSERT INTO user_info VALUES (?, ?)");
 $stmt->bindParam(1, $a);
 $stmt->bindParam(2, $b);
 $a=$user_name;
 $b=$password;
 $stmt->execute();
}
catch(PDOException $e) {echo $e->getMessage();}

?>

【问题讨论】:

  • 抛出的异常信息是什么?
  • 请帮助我们。 $e->getMessage() 是否返回任何内容?
  • 没什么....这让我发疯了
  • 另一个像我这样的问题还没有答案...帮助! (stackoverflow.com/questions/2683405/…)
  • 你的表有主键吗?尝试明确指定您的列,例如INSERT INTO user_info(username, password= VALUES(?, ?)

标签: php sqlite pdo


【解决方案1】:

在与 cmets 中的@DerrickCoetzee 讨论后,我有时间重新考虑这个答案。事实上,答案实际上可能是在一些服务器上解决此问题的唯一方法。我曾建议授予对数据库的通用写访问权限,这无疑是不安全的。我发现,为什么这是我唯一的解决方案是我的服务器禁用了 php 的写访问权限。 php 无法创建新文件,并且我无法将数据库的所有者更改为 apache 或没有 root 访问权限的“nobody”,这使得更好的解决方案变得不可能。

基本上,我的服务器已经锁定了 php,因此它只能在 每个人 可以写的情况下写。在我看来,这是一个糟糕的服务器设置,导致了这种安全风险,正如@Derrick 所建议的那样,sqlite db 可能应该只用于私人用途或仅限服务器访问。某些系统未设置为安全地利用此功能。如果你发现 php 没有写权限并且你没有对机器的 root 权限,你应该考虑联系你的系统管理员或者切换到 MySQL 如果它可用。

话虽如此,当数据库不敏感或只有一小部分人知道时,我发现以下解决方案对于快速原型解决方案非常方便。


我之前的回答:

我今天也遇到了同样的问题!我对 php 和 sqlite 很陌生,但一直在努力。突然间,我遇到了这个巨大的障碍(一天没有进展),因为我没有插入我的 sqlite 数据库,正如问题海报所描述的那样。这里的区别在于没有错误信息或异常,只有将execute语句放入if子句时返回false。

所以,我终于找到了一种让插入工作的方法,但我不能 100% 确定它是否安全。如果您认为有更好的方法,我将不胜感激。

主要问题是您试图让您的用户写入文件系统上的文件。但是,默认情况下,文件夹和文档仅对外部人员具有读取权限。因此,您需要将您的数据库 (user.db) 和它的文件夹 (./db) 都授予其他人可写访问权限。

所以,你需要进入目录并输入:

chmod 777 ./db
chmod 766 ./db/user.db

这为我解决了这个问题,所以我希望它也能帮助你。不知道有没有更好的办法,但是看起来比较合乎逻辑。

【讨论】:

  • 除非您系统上的所有用户都是可信的(这通常是一个错误的假设),否则让任何数据库文件都可写是非常危险的。任何拥有帐户的用户(或已泄露任何帐户的用户)都可以轻松破坏整个数据库。如果一个数据库真的需要在这样的用户之间共享,你可能应该使用像 MySQL 这样的数据库服务器,它具有有限权限的数据库用户。
  • 感谢有关 MySQL 的提示,但正如问题所问,您如何使用 sqlite 以其他方式做到这一点?我完全理解这样的担忧,但是对于 sqlite,我个人不知道另一种方式。这只是使用 sqlite 的限制还是有更好的方法?
  • sqlite 通常用于数据库对单个用户私有(例如存储用户的应用程序数据)或通过服务间接访问的情况(例如通过服务器端 Web像 PHP 这样的脚本),在这种情况下,它只需要服务的特殊用户可以访问。
  • @DerrickCoetzee 非常感谢您的讨论。我发现我遇到的主要原因是 php 根本没有 no 写访问权限,我不能授予 apache/php 所有权。我在此解决方案的顶部做了一个说明,说明为什么它不安全,但可能可用于不敏感/不安全的数据的少量使用。
  • 我刚刚遇到了同样的问题,原来是因为 sqlite 要求托管它的 db 的目录也是可写的。 (见stackoverflow.com/questions/1485525/…)。因此,您可以将您的 db 推送到另一个目录,如下所示:db/database.sqlite 然后创建“db”及其下的所有内容均归 apache 拥有(或任何适合您的服务器的内容)。
【解决方案2】:

您在定义 $a 和 $b 之前将它们绑定为参数。

$user_name=$_POST['user_name'];
$password=$_POST['password'];
$a=$user_name;
$b=$password;

try{
 $stmt = $dbh->prepare("INSERT INTO user_info (user_name, password) VALUES (?, ?)");
 $stmt->bindParam(1, $a);
 $stmt->bindParam(2, $b);
 $stmt->execute();
}
catch(PDOException $e) {echo $e->getMessage();}

实际上,没有必要先将值分配给 $user_name 和 $password。只需先将它们分配给 $a 和 $b。

[编辑 SQL 以包含列名]

【讨论】:

  • 我改代码如下:prepare("INSERT INTO user_info ('user_name', 'password') VALUES(?, ?)"); $stmt->bindParam(1, $a); $stmt->bindParam(2, $b); $stmt->执行(); } catch(PDOException $e) {echo $e->getMessage();} ?>
  • INSERT INTO user_info(username, password) 不是'username', 'password'
  • @Christian Joudrey 是对的。删除列名周围的引号。那么它应该可以工作了。
【解决方案3】:

试试这个方法:

$stmt = $dbh->prepare("INSERT INTO user_info VALUES (?, ?)");
$data = array($user_name, $password);
$stmt->execute($data);

【讨论】:

    【解决方案4】:

    当您绑定参数时,$a$b 不存在。

    试试这个:

     $stmt->bindParam(1, $user_name);
     $stmt->bindParam(2, $password);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2014-08-13
      • 1970-01-01
      • 2017-07-16
      相关资源
      最近更新 更多