2

(これは私の最初の投稿です)MySQLデータベースに「データセット」を入力するためのPHPスクリプトを作成しました。データを入力する前に、「データセット」がすでにデータベースにあるかどうかを確認したいと思います。

私の問題:それはいくつかのデータセットに対してのみ機能します(はい、大文字と小文字を忘れなかったと確信しています)ので、ここにスクリプトがあります(ドイツ語のコメントは必要ありません...):

<!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>
4

5 に答える 5

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

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

$var == ''そして、 useを使用する代わりに変数が空であるかどうかを確認するためのアドバイスがありますempty($var)

于 2012-04-29T18:37:03.987 に答える
1

または、テーブルを再構築し、ON DUPLICATEKEYUPDATEを使用します。

于 2012-04-29T18:38:14.183 に答える
1

この行で:

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

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

大文字/小文字以外のもう1つのことは、末尾のスペースです。末尾の空白を削除するには、必ずtrim()を使用してください。

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

また、ここに示したコードは、MySQLインジェクション攻撃の影響を受けやすくなっています。「mysql_real_escape_string」のPHPマニュアルページを必ずお読みください。

于 2012-04-29T18:40:32.097 に答える
1

他の人がここで言うことに加えて、あなたはおそらくあなたのチェックを間違ってやっています。まず、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そこに意図したものかどうかはわかりませんが、意図したとしても、そのようなチェックを方法で実行したいので、大きなテーブルで多くの節約になります。

于 2012-04-29T19:52:30.500 に答える
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");
    }

}

于 2012-04-29T18:43:04.307 に答える