在添加到数据库之前重复检查

时间:2012-07-18 01:51:25

标签: php mysql

我有一个有用的代码,但实际上并不是我无法弄清楚为什么,我想要做的是检查数据库内部是否已经存在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!';
}

3 个答案:

答案 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版本的人都可以继续。