2012-04-29 26 views
2

(これは私の最初の投稿です) MySQLデータベースに "データセット"を入力するためのPHPスクリプトを書いています。 私はデータを入力する前に、 "データセット"が既にデータベースに入っているかどうか確認したいと思います。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文を使って2つのクエリの内容を結合することができます: 'SELECT inp FROM $ tabelle where inp = '$ inp' OR titel = '$ titel'' – hovmand

答えて

0

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

あなただけつの結果のためにテストしています。たぶん、複数の結果がありますか?おそらく、2つのレコードが "inp_einlesen"と一致し、 'titel_einlesen'に1つしか一致しない場合がありますか?つまり、データセットに既に重複がある場合、各フィールドの重複が1つしかない限り、この行はそれらを検出しません。

大文字以外の別のものは後続のスペースです。末尾の空白を削除するには、必ずtrim()を使用してください。

標準化したいことは、エスケープの処理方法です。誰かがアポストロフィを持つデータを入力した場合、手動でエスケープするか、magic_quotesのように下位レベルで対処する必要があります。

また、ここで紹介したコードは、MySQLインジェクション攻撃の影響を受けやすいです。 "mysql_real_escape_string"のPHPのマニュアルページを必ず読んでください。

+0

ありがとう。あなたの質問に対する答えを必ず選択してください! –

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

これは、1つのレコードが存在するのみとする場合にのみことを意味しますが、複数存在する必要があります。 !=0

==1を交換し、ここで、変数ではなく、代わりにempty($var)

0

$var == ''使用を使用しての空である場合には、テーブルを再構築し、ON DUPLICATE KEY UPDATEを使用チェックするアドバイスです。この行で

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つのクエリを1つにマージすることができます。

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

は、今では両方のフィールドが一致した場合にのみ、あなたが失敗していることを確認する方が簡単です。あなたが実際にANDを意図していたかどうかは確かではありませんが、たとえそうしたとしても、そのようなチェックをやりたいのですが、大きなテーブルにたくさん保存します。

関連する問題