无法通过php PDO插入到SQLite数据库中

时间:2011-01-08 16:18:14

标签: php sqlite pdo

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

<?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();}

?>

4 个答案:

答案 0 :(得分:5)

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

基本上,我的服务器已经锁定了php,只有当所有人可以写时它才能写入。在我看来,这是一个糟糕的服务器设置,这导致了这种安全风险,正如@Derrick建议的那样,sqlite数据库应该只能用于私人用途或仅用于服务器访问。某些系统未设置为利用此安全。如果您发现php没有写访问权限且您没有对该计算机的root访问权限,则应考虑联系您的系统管理员或切换到MySQL(如果可用)。

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


我之前的回答:

今天我遇到了同样的问题!我是php和sqlite的新手,但是很随意。突然之间,由于问题海报所描述的缺少插入我的sqlite数据库,我遇到了这个巨大的障碍(一天没有进展)。这里的区别因素是没有错误消息或异常,只有在将execute语句放入if子句时才返回false。

所以,我终于能够找到一种方法让插入工作,但我不是百分之百确定它是否安全。如果您认为有更好的方法,我会很感激。

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

因此,您需要转到目录并输入:

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

我已经解决了这个问题,所以我希望它能帮到你。我不知道是否有更好的方法,但似乎相当合乎逻辑。

答案 1 :(得分:0)

当你绑定你的参数时$a$b不存在。

请改为尝试:

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

答案 2 :(得分:0)

在定义它们之前,你将$ 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以包含列名]

答案 3 :(得分:0)

以这种方式尝试:

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