2015-10-03 84 views
3

當使用預處理語句在PHP中向SQLite3插入多行時,如果未綁定行的參數,則前一行的值將會即使您「清除」了各行之間的聲明,也可以插入。在SQLite3語句中清除綁定似乎不起作用(PHP)

請看下面的例子:

$db = new SQLite3('dogsDb.sqlite'); 

//create the database 
$db->exec("CREATE TABLE Dogs (Id INTEGER PRIMARY KEY, Breed TEXT, Name TEXT, Age INTEGER)");  

$sth = $db->prepare("INSERT INTO Dogs (Breed, Name, Age) VALUES (:breed,:name,:age)"); 

$sth->bindValue(':breed', 'canis', SQLITE3_TEXT); 
$sth->bindValue(':name', 'jack', SQLITE3_TEXT); 
$sth->bindValue(':age', 7, SQLITE3_INTEGER); 
$sth->execute(); 

$sth->clear(); //this is supposed to clear bindings! 
$sth->reset(); 

$sth->bindValue(':breed', 'russel', SQLITE3_TEXT);   
$sth->bindValue(':age', 3, SQLITE3_INTEGER); 
$sth->execute(); 

即使我希望第二行有「名字」列NULL值,該值是「傑克」,而不是!

因此,無論是「清除」似乎都不起作用(儘管它返回true),或者我還沒有真正理解它應該做什麼。

如何清除SQLite3(甚至PDO)中的插入之間的綁定?插入多行的最佳方式是哪些行的某些字段可能具有空值?

+0

這剛剛被確認爲PHP錯誤,請看這裏:[https://bugs.php.net/bug.php?id=70628](https://bugs.php.net/bug。 php?id = 70628) – symos

回答

0
#include <sqlite3.h> 
#include <stdio.h> 

int main(void) { 

    sqlite3 *db; 
    char *err_msg = 0; 
    sqlite3_stmt *res; 
    sqlite3_stmt *res1; 
    int rc = sqlite3_open("test.sqlite", &db); 

    if (rc != SQLITE_OK) { 

     fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db)); 
     sqlite3_close(db); 

     return 1; 
    } 

    char *sql = "CREATE TABLE Dogs (Id INTEGER PRIMARY KEY, Breed TEXT, Name TEXT, Age TEXT)"; 
    rc = sqlite3_prepare_v2(db, sql, -1, &res, 0); 
    if (rc == SQLITE_OK) { 
     rc = sqlite3_step(res); 

    } 
    sqlite3_finalize(res); 

    char *sql1 = "INSERT INTO Dogs (Breed, Name, Age) VALUES (:breed,:name,:age);"; 

    rc = sqlite3_prepare_v2(db, sql1, -1, &res1, 0); 


    if (rc == SQLITE_OK) { 
     printf("%d\n", sqlite3_bind_text(res1, 1, "breed1", 6, SQLITE_STATIC)); 
     sqlite3_bind_text(res1, 2, "name1", 5, SQLITE_STATIC); 
     sqlite3_bind_text(res1, 3, "age1", 4, SQLITE_STATIC); 
     printf("%d\n", sqlite3_step(res1)); 
    } else { 

     fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db)); 
    } 
    sqlite3_reset(res1); 
    sqlite3_clear_bindings(res1); 
    printf("%d\n", sqlite3_bind_text(res1, 2, "name2", 5, SQLITE_STATIC)); 
    printf("%d\n", sqlite3_bind_text(res1, 3, "age2", 4, SQLITE_STATIC)); 

    printf("%d\n", sqlite3_step(res1)); 


    sqlite3_finalize(res1); 
    sqlite3_close(db); 

    return 0; 
} 
+0

我改變了我的答案與一些工作的C代碼。也許你已經打了一個PHP的bug .. – user993553

+0

這個bug似乎提醒了這個問題https://bugs.php.net/bug.php?id=47145 – user993553

+0

感謝您的回覆。如果等效代碼在C中起作用,那麼這意味着_probably_這是一個PHP錯誤。不過,我不確定它與您鏈接的其他錯誤有關。 – symos