(这是我的第一个帖子)我编写了一个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>
在这一行:
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"。
if (mysql_num_rows($inp_einlesen) == 1 and mysql_num_rows($titel_einlesen) == 1)
这意味着仅当存在一条记录时,必须有多个记录。将==1
替换为!=0
这里有一个建议来检查变量是否为空,而不是使用$var == ''
使用empty($var)
或者,重构表并使用重复键更新。
除了其他人在这里说的,你可能做错了检查。首先,您的 2 个查询可以合并为一个:
$dup = mysql_query("SELECT TRUE FROM $tabelle WHERE inp='$inp' AND titel='$titel' LIMIT 1");
if (mysql_num_rows($dup)) {
// duplicate playlist
}
现在更容易看到,只有当两个字段匹配时,您才会失败。不确定你是否真的打算在那里AND
,但即使你这样做了 - 你宁愿用方式做这样的检查,在大桌子上节省很多。
也许这样的事情会起作用?如果已经有条目或没有,则可以运行代码:
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");
}
}