2014-12-03 52 views
1

我想創建一個函數,它根據你傳入函數的表,列和匹配變量重複一行。我基本上插入一個空白行並獲取該行的id,然後用新信息更新它。我遇到的問題是,有時表中有一個唯一的鍵,所以我得到了很多關鍵錯誤的重複條目。在PHP中爲mysql創建一個重複的行函數

在行更新之前,我檢查它是否是一個具有唯一鍵的列,如果是這樣,只是基本上插入一個空白,但這仍然不起作用。有沒有辦法讓它爲這個列生成一個隨機值,直到用戶改變它爲止?

這裏是我重複的功能代碼:

public function duplicateRecord($table, $column, $record) { 

     $dbcon = mysqli_connect(DB_HOST,DB_USER,DB_PASS,DB_NAME); 

     $query = "SELECT * FROM {$table} WHERE {$column} = '{$record}'"; 

     $describe_query = "DESCRIBE {$table}"; 
     $describe_result = mysqli_query($dbcon,$describe_query); 

     $unique_arr = array(); 
     while($row = mysqli_fetch_assoc($describe_result)) { 

      if ($row['Key'] == 'PRI' || $row['Key'] == 'UNI') { 

       $unique_arr[] = $row['Field']; 

      } 

     } 

     $result = mysqli_query($dbcon, $query); 
     $original = mysqli_fetch_assoc($result); 

     $insert_query = "INSERT INTO {$table} (`{$column}`) VALUES (NULL)"; 
     mysqli_query($dbcon, $insert_query); 
     $newid = mysqli_insert_id($dbcon); 

     $update_query = "UPDATE {$table} SET "; 
     foreach ($original as $key => $value) { 
      if ($key != $column) { 

       if (in_array($key,$unique_arr)) { 

        $update_query .= "{$key} = NULL, "; 

       } else { 

        $update_query .= "{$key} = '{$value}', "; 

       } 

      } 
     } 

     $update_query = substr($update_query,0,strlen($update_query)-2); 
     $update_query .= " WHERE {$column} = '{$newid}'"; 

     echo $update_query; 

     mysqli_query($dbcon, $update_query); 

     return $newid; 

    } 

任何幫助將不勝感激,謝謝。

+0

你不能只是將此列設置爲空字符串? – Haris 2014-12-03 13:58:06

+0

我試過了,但除非用戶進入並在再次複製之前將空字符串更新爲值,否則仍會引發錯誤。 ''''的值仍然是唯一值。 – 2014-12-03 14:00:00

+0

我看到if($ row ['Key']'這個告訴我你有一行叫做「Key」,是否正確?如果是這樣,那麼你知道「key」是MySQL保留字,並且需要特別注意if你是不是已經這樣做了,我想「DESCRIBE」會處理這個問題。 – 2014-12-03 14:00:49

回答

1

所以基本上我最終做的只是使用表名和新的id的md5來生成一個10字符的子字符串,我只是將其作爲填充符插入,這樣,如果用戶多次複製同一行,將始終存在插入的唯一值。

雖然如果有人知道更優雅的解決方案,我總是樂於接受建議。 :)

if (in_array($key,$unique_arr)) { 

    $unique = md5($table.$newid); 
    $unique = substr($unique,0,10); 

    $update_query .= "{$key} = '{$unique}', "; 

} 
+0

如果表名是相同的名稱,MD5將產生相同的哈希值您可能想要添加一些東西對,就像一個UNIX時間戳和'uniqid()'。 – 2014-12-03 14:09:12

+0

是的,我可以添加時間,我連接了新的產品ID,因爲這也將是唯一的,謝謝! – 2014-12-03 14:11:49

+0

啊,好主意,歡迎布蘭登。 – 2014-12-03 14:12:24

相關問題