0

我有一个可以工作的代码,但不是真的我不知道为什么,我想做的是检查数据库内部的 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!';
}
4

3 回答 3

4

您应该在 MySQL 中创建字段,而不是在 PHP 端进行检查UNIQUE。这样就可以在数据库级别进行唯一性检查(这可能会更有效率)。

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你真的应该加一个。有很多原因。你可以这样做:

ALTER TABLE tbl ADD Id INT;
ALTER TABLE tbl ADD PRIMARY KEY(Id);
于 2012-07-18T01:52:35.413 回答
1

您应该听取 PhpMyCoder 关于 UNIQUE 字段类型的建议。

此外,您没有打印任何错误。

确保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!';
}
于 2012-07-18T01:58:17.727 回答
0

正如 PhpMyCoder 所说,您应该为表添加一个唯一索引。

为了补充他的答案,这里是您如何只用一个查询来做您想做的事情。

添加唯一索引后,如果您尝试“INSERT INTO”并导致重复,MySQL 将产生错误。

您可以使用 mysql_errno() 找出是否有重复条目并告诉用户。

例如

$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 版本的人,请继续。

于 2012-07-18T02:06:27.483 回答