我有一个有用的代码,但实际上并不是我无法弄清楚为什么,我想要做的是检查数据库内部是否已经存在URL,如果它让用户知道,如果不是继续并添加它。
该代码还确保该字段不为空。然而,它似乎检查以查看url是否已经存在,但是如果它不再添加到数据库中。此外,重复检查似乎有时它的工作有时它不是那么有点儿。任何指针都会很棒。谢谢。
if(isset($_GET['site_url']) ){
$url= $_GET['site_url'];
$dupe = mysql_query("SELECT * FROM $tbl_name WHERE URL='$url'");
$num_rows = mysql_num_rows($dupe);
if ($num_rows) {
echo 'Error! Already on our database!';
}
else {
$insertSite_sql = "INSERT INTO $tbl_name (URL) VALUES('$url')";
echo $url;
echo ' added to the database!';
}
}
else {
echo 'Error! Please fill all fileds!';
}
答案 0 :(得分:4)
您应该在MySQL UNIQUE
中创建字段,而不是检查PHP端。这种方式有uniqueness checking on the database level(可能效率更高)。
ALTER TABLE tbl ADD UNIQUE(URL);
请注意,当副本为INSERT
时,MySQL会抱怨。你应该监听MySQL返回的错误。使用当前函数,您应该检查mysql_query()
是否返回false并检查mysql_error()
。但是,您应该使用PDO。这样你就可以做到:
try {
$db = new PDO('mysql:host=localhost;db=dbname', $user, $pass);
$stmt = $db->query('INSERT INTO tbl (URL) VALUES (:url)');
$stmt->execute(array(':url' => $url));
} catch (PDOException $e) {
if($e->getCode() == 1169) { //This is the code for a duplicate
// Handle duplicate
echo 'Error! Already in our database!';
}
}
此外,您的表格中有PRIMARY KEY
非常非常重要。你应该添加一个。有a lot of reasons for it。你可以这样做:
ALTER TABLE tbl ADD Id INT;
ALTER TABLE tbl ADD PRIMARY KEY(Id);
答案 1 :(得分:1)
您应该在UNIQUE字段类型上获取PhpMyCoder的建议。
此外,您不会打印任何错误。
确保or die (mysql_error());
功能末尾有mysql_*
以打印错误。
你甚至不应该使用mysql_ *函数。请改为查看PDO或MySQLi。
您还没有执行插入查询...
试试这段代码:
if(isset($_GET['site_url']) ){
$url= $_GET['site_url'];
$dupe = mysql_query("SELECT * FROM $tbl_name WHERE URL='$url'") or die (mysql_error());
$num_rows = mysql_num_rows($dupe);
if ($num_rows > 0) {
echo 'Error! Already on our database!';
}
else {
$insertSite_sql = "INSERT INTO $tbl_name (URL) VALUES('$url')";
mysql_query($insertSite_sql) or die (mysql_error());
echo $url;
echo ' added to the database!';
}
}
else {
echo 'Error! Please fill all fileds!';
}
答案 2 :(得分:0)
正如PhpMyCoder所说,你应该在表格中添加一个唯一的索引。
要添加他的答案,以下是您只需一个查询就可以执行的操作。
添加唯一索引后,如果尝试“INSERT INTO”并导致重复,MySQL将产生错误。
你可以使用mysql_errno()来查明是否有重复的条目并告诉用户。
e.g。
$sql = "INSERT INTO $tbl_name (URL) VALUES('$url')";
$result = mysql_query($sql);
if($result === false) {
if(mysql_errno() == $duplicate_key_error) {
echo 'Error! Already in our database!';
} else {
echo 'An error has occurred. MySQL said: ' . mysql_error();
}
}
mysql_error()将以简单的英语返回mysql错误。
mysql_errno()只返回数字错误代码。所以将$ duplicate_key_error设置为任何代码(我不知道它在我的头顶)并且你已经完成了设置。
另请注意,您不希望向生产中的用户打印任何特定的系统错误。您不希望黑客获取有关您的服务器的各种信息。您只会在测试或非公共程序中打印MySQL错误。
也!重要的是,不推荐使用mysql函数。如果您访问他们的任何页面(例如http://php.net/manual/en/function.mysql-errno.php),您将看到更好的替代方案的建议。你可能想要使用PDO。
任何想要编辑我的答案以将mysql更改为PDO或添加PDO版本的人都可以继续。