2012-04-29 400 views
2

(這是我的拳頭帖子) 我已經寫了一個PHP腳本來在MySQL數據庫中輸入「數據集」。 在我輸入數據之前,我想檢查一下,如果「數據集」已經在數據庫中。PHP MYSQL檢查重複條目

我的問題:它僅適用於一些數據集(是的,我相信我沒有忘記大寫和小寫) 所以這裏是腳本(你不需要德國評論...) :

<!DOCTYPE html> 
<html><head> 
<meta charset="utf-8"> 
<title>Playlist</title> 

<link rel="stylesheet" type="text/css" href="style.css" /> 

<script type="text/javascript"> 
setTimeout("self.location.href='index.php'",6000); 
</script> 

</head> 
<body> 
<div id="enterbody"> 
<?php 
include ('conf.php'); 


mysql_select_db("$datenbank"); 

//Zeit 
$date = date("d-m-Y"); 

//Post 2 var 
$inp = $_POST["inp"]; 
$titel = $_POST["titel"]; 
$link = $_POST["link"]; 

//Länge der Strings 
$l_inp = strlen($inp); 
$l_titel = strlen($titel); 
$l_link = strlen($link); 

//eingabestrings in kleine zeichen umwandeln 
$s_inp = strtolower($inp); 
$s_titel = strtolower($titel); 

//datenbankstrings in kleine zeichen umwandeln 


//Ausgabe 

echo "Länge des Interpreten: $l_inp (max: 50)</br>"; 
echo "Länge des Titels: $l_titel (max: 50)</br>"; 
echo "Länge des Links: $l_link (max: 42)</br>"; 

if ($inp == "" or $titel == "") 
{ 
    echo "Bitte fülle die notwendigen Felder aus!"; 
} 
else 
{ 
    if ($l_inp > 50 or $l_titel > 50 or $l_link > 42) 
    { 
     echo "Der Interpret/Titel/Link ist zu Lange, deshalb wurde er nicht in die Datenbank eingetragen!"; 
    } 
    else 
    {  
      //stringkonvertierung nicht vergessen 
      $inp_einlesen = mysql_query("SELECT inp FROM $tabelle WHERE inp='$inp'"); 
       $titel_einlesen = mysql_query("SELECT titel FROM $tabelle WHERE titel='$titel'"); 

       if (mysql_num_rows($inp_einlesen) == 1 and mysql_num_rows($titel_einlesen) == 1) 
       { 
         echo "<b>$inp</b> mit dem Track <b>$titel</b> ist schon in der Datenbank vorhanden, deshalb wird der Datensatz nicht eingetragen"; 
       } 
       else 
       { 

       $entry = "INSERT INTO playlist (inp, titel, link, date) VALUES('$inp','$titel','$link', NOW())"; 
       $enter_data = mysql_query($entry); 


       if ($enter_data == true) 
       { 
        echo "Deine Daten wurden gespeichert! Weiterleitung..."; 
       } 
       else 
       { 
           echo "Fehler beim Eintragen der Daten..."; 
         } 

       } 
    } 
} 



mysql_close($connection); 
?> 
</div> 




</body> 
</html> 
+0

注意:未定義變量:inp,titel,link。 XSS&sql注入...... –

+0

只需稍加註意,您可以使用OR語句來加入兩個查詢的內容:'SELECT inp FROM $ tabelle WHERE inp ='$ inp'或titel ='$ titel'' – hovmand

回答

0

在此行中:

if (mysql_num_rows($inp_einlesen) == 1 and mysql_num_rows($titel_einlesen) == 1) 

你只是測試的一個結果。也許你有多個結果?也許兩個記錄有「inp_einlesen」匹配,只有一個匹配「titel_einlesen」?換句話說,如果你的數據集已經有重複,這行不會找到它們,除非每個字段只有一個副本。

除了大寫/小寫之外的另一件事是尾隨空格。一定要使用trim()來刪除尾隨的空格。

您可能想要標準化的另一件事是如何處理轉義。如果某人在其中輸入帶撇號的數據,則需要手動將其轉義或在較低級別處理,例如magic_quotes。

另外,這裏提供的代碼容易受到MySQL注入攻擊。請務必閱讀PHP手冊頁中的「mysql_real_escape_string」。

+0

謝謝。一定要選擇你的問題的答案! –

0
if (mysql_num_rows($inp_einlesen) == 1 and mysql_num_rows($titel_einlesen) == 1) 

這意味着,只有且僅當一個記錄存在,但必須有一個以上。與!=0

這裏更換==1是一個建議,以檢查是否變量是空的,而不是使用$var == ''使用empty($var)

0

也許這樣的事情會工作?如果已經有一個條目,您可以運行代碼,或者如果沒有:

if($variable != '') { 
    $qry = "SELECT * FROM table WHERE column='$variable'"; 
    $result = mysql_query($qry); 
    if($result) { 
     if(mysql_num_rows($result) > 0) { 
     //Already exists 
     } 
     else { 
     //Doesn't already exist 
     } 
    } 
    else { 
     die("Query failed"); 
    } 

}

0

除了別人說什麼在這裏,你可能會做你檢查錯誤。首先那些您2個的查詢可以合併爲一個:

$dup = mysql_query("SELECT TRUE FROM $tabelle WHERE inp='$inp' AND titel='$titel' LIMIT 1"); 
if (mysql_num_rows($dup)) { 
    // duplicate playlist 
} 

現在,它更容易看到你只有失敗,如果這兩個字段匹配。不知道你是否真的打算在那裏使用AND,但即使你這樣做 - 你寧願用這種方式進行檢查,也可以在大型桌子上節省很多。