2015-04-16 40 views
0

我想在將數據輸入到數據庫列之前檢查元組數據是否存在。我正在嘗試mysql_query,並得到我應該使用mysqli的錯誤,但它似乎沒有爲我工作。檢查數據庫中是否存在元組數據,然後插入

這是到目前爲止我的代碼

foreach ($AllData as $sigleData) { 
    $table = $sigleData['name']; 
    $columns = implode(", ", $sigleData['columns']); 
    $columnData = implode(" ',' ", $sigleData['data']); 

    //insert into database tuple data  
    $sqlQuery = "INSERT INTO " . $table . " (" . $columns . ") VALUES('" . $columnData . "')"; 

    if ($dbConnectionT->query($sqlQuery) == TRUE) { 
     echo "database updated"; 
     echo "</br>"; 
    } 
} 

我有這樣的功能: -

 function check_tuple_exists($table){ 
     global $dbConnectionT; // connection to database 
     $sql = "SELECT ALL FROM '".$table."'"; 
     $res = $dbConnectionT->query($sql); 
     if ($res->num_rows > 0) 
     { // output data of each row 
      while($row = $res->fetch_assoc()) { 
      echo "data " . $columnData . "<br>"; 
      } 
     } else 
       { 
        echo "0 results"; 
       }  

     } 

,但它給了我這個錯誤: - 試圖讓非對象

+0

你的代碼似乎沒有檢查數據庫中是否存在任何東西,所以我不明白這個問題。 –

+0

對不起,我剛剛添加了我創建的功能@GordonLinoff – tony

+1

如果你不想在數據庫中有重複的條目,那麼你**不會**你在做什麼。您創建一個唯一的密鑰,並且只能插入。如果記錄存在,MySQL將使用SIGNAL SQLSTATE,這在大多數語言中被解釋爲一個例外。這種做事方式的原因是MySQL和連接客戶端之間存在一定的延遲(在你的情況下,這是PHP)。當您得到某些信息不存在的信息時,另一個進程可能會在此期間插入數據。這就是爲什麼我們讓數據庫擔心數據完整性,而不是使用它們的語言。 –

回答

1
財產

那麼,如果你這樣做是因爲你想更新/跳過插入你插入的數據,你應該嘗試使用INSERT REPLACEINSERT IGNORE q而不是預先檢查。對你來說會更容易,對你的應用程序更乾淨,更快速。檢查這個問題看的區別:

What is the performance difference between "insert ignore" and replace in MySQL?

基本上是:

  • INSERT忽略如果存在
  • INSERT REPLACE更改該行是否存在

而且跳過插入和這是FYI,請注意您的代碼中可能有SQL注入。檢查PDO並準備語句以避免它們。

+0

我只是想嘗試檢查它們,如說用戶名和密碼檢查 – tony

1

更快更簡單的方法(始終確保數據庫始終如一,獨立於PHP)是在MySQL表上創建一個複合UNIQUE索引(請參閱MySQL docs,這在phpMyAdmin中也是可行的)。該索引應該包含在這個組合中必須唯一的所有列;在你的情況下,這將是所有列。

此索引確保您的表中沒有重複項。當您使用PHP插入新行時,只需使用語句INSERT IGNORE INTO ...(請參閱docs)。這將首先檢查是否已經有一行具有相同的內容。在這種情況下,該語句將被忽略,否則將被創建。

+0

我只是想嘗試檢查它們,比如說一個用戶名和密碼檢查 – tony

相關問題