2011-01-08 145 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);