2016-06-21 43 views
0

我嘗試插入多個記錄無PK臺如何插入無主鍵的多個記錄無脂肪框架

for ($x = 0; $x < count($arr); $x++) { 
    $name=$arr[$x]; 
    $user=new DB\SQL\Mapper($f3->get('DB'),'User'); 
    $user->name=$name; 
    $user->save(); 
} 

最後,只有一條記錄插入到數據庫

我也試過reset ,但仍然只有一條記錄

for ($x = 0; $x < count($arr); $x++) { 
    $name=$arr[$x]; 
    $user=new DB\SQL\Mapper($f3->get('DB'),'User'); 
    $user->reset(); 
    $user->name=$name; 
    $user->save(); 
} 

如果我添加一個auto_increment主鍵此表中,那麼它是沒有問題的。


更新1:

我的網頁瀏覽器再次測試問題。然後我得到這個錯誤

Internal Server Error 

PDOStatement: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 

所以我不能save()後執行$db->log(),現在我知道爲什麼只有一個記錄,因爲PHP在第一循環停止。

然後啓用general_log_file,我發現這個日誌文件

160621 18:00:53 47 Connect [email protected] on my_db 
      47 Query SET NAMES utf8 
      47 Query SHOW columns FROM `my_db`.`UserAccount` 
      47 Query INSERT INTO `UserAccount` (`name`) VALUES ('uName') 
      47 Quit 

所以我嘗試運行該SQL INSERT INTO `UserAccount` (`name`) VALUES ('uName')並沒有得到錯誤。

我也檢查了/var/log/mysql.log/var/log/mysql.err是空的。

現在我不知道如何找出問題

回答

1

你的第二次嘗試是正確的:

foreach($names as $name) { 
    $user->reset(); 
    $user->name=$name; 
    $user->save(); 
} 

這意味着要上班,即使對於沒有主鍵映射器。

請記住,如果沒有主鍵,您將無法更新$user。從docs引用:

雖然數據庫中的所有表中有主鍵的問題是議論文,F3不會創建與不含主鍵的表通信的數據映射對象阻止你。唯一的缺點是:您無法刪除或更新映射記錄,因爲F3絕對沒有辦法確定您所指的是哪條記錄。

注意:如果您仍在拼寫插入記錄,可以輸出數據庫日誌$db->log()以查看哪些查詢在引擎後面運行。

UPDATE:

爲了能夠輸出數據庫日誌時出現錯誤,你可以在ONERROR事件掛鉤:

$f3->ONERROR=function($f3) { 
    echo $f3->get('DB')->log(); 
} 
$mapper->save();// SQL error will trigger ONERROR 
+0

您可以在ONERROR事件掛鉤。看到我更新的答案。 '$ user-> save()'觸發2條語句:'INSERT'和'SELECT'(重新載入新的新數據)。我懷疑'INSERT'語句順利,但後續的SELECT失敗,出於某種原因(它不應該)。順便說一句,你使用的是最新版本的框架? – xfra35

+1

好吧,我現在明白了。你遇到了幾個月前已經修復的錯誤。新版本應該在一兩週內發佈,並將包含該補丁。然而,你可以下載最新的開發版[現在](https://github.com/bcosca/fatfree-core),這將解決你的問題。 – xfra35

+0

'''2016年6月21日星期二10:44:41 +0000(0.1ms)SHOW my_db'.'UserAccount'; 2016年6月21日星期二10:44:41 +0000(0.1ms)INSERT INTO'UserAccount'('name')VALUES('uName2')2016年6月21日星期二10:44:41 +0000(0.1ms)SELECT'名'從'UserAccount' WHERE''',我得到了這個,現在我明白了爲什麼。它在我插入後選擇記錄,但在'''where'後面有空,所以我得到了錯誤,可能這是一個錯誤? –