2011-01-08 72 views
2

请帮助看看是什么错误......(我测试数据库连接是罚款)无法插入到SQLite数据库通过PHP 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();} 

?> 
+0

什么是抛是异常消息? – 2011-01-08 16:21:16

+0

请帮助我们的帮助。 $ e-> getMessage()是否返回任何内容? – alexn 2011-01-08 16:21:35

+0

什么都没有....这让我疯狂 – lkahtz 2011-01-08 16:22:05

回答

0

试试这个:

$stmt->bindParam(1, $user_name); 
$stmt->bindParam(2, $password); 
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包括列名]

4

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

本质上,我的服务器已锁定的PHP,使它只能编写如果大家可以写。在我看来,这是一个糟糕的服务器设置,导致了这种安全风险,正如@Derrick所言,sqlite数据库可能只能用于私人用途或仅用于服务器访问。有些系统未设置为安全地利用这个。如果您发现php没有写权限,并且您没有root访问权限,那么您应该考虑联系您的系统管理员,或者在可用时切换到MySQL。这就是说,我发现以下解决方案对于快速原型解决方案非常有用,当数据库不敏感时,或者只会被一小部分选定的人群所了解。


我以前的答案:

我今天有这个完全相同的问题!我对php和sqlite相当陌生,但是一直在徘徊。突然间,我遇到了这个巨大的障碍(一天没有进展),因为没有插入我的sqlite数据库,如问题海报所述。这里的区别因素是没有错误消息或异常,如果将执行语句放入if子句中,只返回false。

因此,我终于能够找到一种方法让插入工作,但我不是100%确定,如果它是安全的或不。如果您认为有更好的方法,我会很感激任何意见。

主要问题是您试图让您的用户写入文件系统上的文件。但是,默认情况下,文件夹和文档只能访问外部人员。因此,你需要给你的数据库(user.db)和它的文件夹(./db)可写的访问别人。

所以,你需要去的目录,然后输入:

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

这解决了这个问题对我来说,我希望它可以帮助你出去了。我不知道是否有更好的方法,但它似乎相当合乎逻辑。

0

试试这样说:

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