2015-09-07 72 views
0

第一次發佈到StackOverflow,但我一直是這裏評論的很長一段時間的讀者。PHP MySQLi準備語句綁定某些字符的錯誤?

我遇到了一個編程錯誤,幾個小時後我找不出來,也沒有找到任何似乎適用的問題和答案,所以這裏是我的第一篇文章!

我使用PHP和MySQLi prepared語句將源自文件的數據插入數據庫,並將每個記錄從文件存儲到數組($ dbData [])中,該數組傳遞給執行數據庫存儲。我檢查了每個記錄的所有四個索引的數組值,並且數據存在於所有記錄字段中,儘管在一些字符串中有很多斜槓(向前和向後),撇號,引號(單和雙)和html標記內容。

$ dbData數組與表中插入的列相關。 該表被稱爲「內容」,它對第二列有一個約束,它不能爲空。它被命名爲'CText'。

在數據數組上運行的代碼是在一個循環中調用所有文件數據的函數。我正在提供下面的功能的內容,沒有功能接口。爲了簡化目的,我包含了連接到數據庫的代碼,但實際創建數據庫連接的代碼位於該函數之外。

$mysqli = new mysqli("example.com", "user", "password", "database"); 
... 
$queryText = "insert into content values (?, ?, ?, ?)"; 
$query = mysqli->prepare($queryText); 
$query->bind_param('dsds',$dbData[0],$dbData[1],$dbData[2],$dbData[3]); 
if (!$query->execute()) { 
    echo '<br>Execute failed: (' . $query->errno . ') . $query->error; 
    echo '<br>dbData[1]: ' . $dbData[1]; 
} 

插入適用於大多數的$ dbData記錄的數據,但我得到這個錯誤在少數的記錄:

,可執行失敗:(1048)列「CTEXT」不能爲空 CTEXT:{數據在這裏打印的是這似乎是在字符串內容一行返回後截斷}

我的問題是綁定是否可能與某些字符的問題,像換行/回車或一些其他組合。我沒有在代碼中設置字符編碼,因此默認編碼正在使用中。

+0

你可以使用'var_dump($ dbData [1])'在你看到錯誤信息的地方,當你看到它時,你也會看到那個值是什麼造成了這個問題 –

+0

var_dump顯示一個字符串(51)「{內容}「。 –

+0

內容實際上是約600個字符,存儲在綁定使用的數組中。 –

回答

2

綁定是否對某些字符有問題,如換行/回車或其他組合。

沒有。綁定沒有問題。這種錯誤消息的唯一原因是數據爲空時。

這裏是簡單的清單,以解決所有類型的問題。

  1. 相信你的眼睛。你不是mysqli準備好的語句的唯一用戶。有數百萬人,還沒有人遇到過這樣的問題。意思是如果數據庫報告該值不能爲空,則值爲空。
  2. 無論如何,如果你仍然認爲有一個bug - 創建一個孤立,可重新編程的代碼示例。意味着不僅僅是爲了向讀者展示不可行的草圖,而是一個任何人都可以複製的完整工作示例。如

    $mysqli = new mysqli("example.com", "user", "password", "database"); 
    $mysqli->query("CREATE TABLE content ..."); 
    $queryText = "insert into content values (?, ?, ?, ?)"; 
    $query = $mysqli->prepare($queryText); 
    $dbData[0] = 0; 
    $dbData[1] = 'some text that yo think is causing the error'; 
    $dbData[2] = 0; 
    $dbData[3] = 'some another text'; 
    $query->bind_param('dsds',$dbData[0],$dbData[1],$dbData[2],$dbData[3]); 
    if (!$query->execute()) { 
        echo '<br>Execute failed: (' . $query->errno . ') . $query->error; 
        echo '<br>dbData[1]: ' . $dbData[1]; 
    } 
    

    沒有循環。沒有任何代碼沒有顯示 - 但是一個完整的工作示例產生了指出的錯誤。

  3. 在這樣一個例子失敗後,開始調試你的代碼,找到一個邏輯錯誤,無論是程序流還是調試方式。

你必須認識到,這樣的問題(「我在PHP出晴空的一個bug」)不能有另一個接收沒有reproduceable例子。

+0

感謝您的建議,將採取這種方法在後續的錯誤問題。 –