如何检查与另一个值相比一行是否存在


How to check if a row exists compared to another value

我不知道如何在PHP &MySQL;

基本上,我只想检查表中是否存在一行,如果存在,返回错误,例如:

$exists = MYSQL CODE TO CHECK HOW MANY ROWS INCLUDE BADGE_ID
if($exists >= 1)
{
$errors[] = "Exists.";
}

类似的东西,因为我正在编写一个小型商店脚本,我希望它检查以确保他们没有badge_id。db的结构为user_idbadge_id (user_id = 1, badge_id = 1;例如)

//Mysql
$res = mysql_query("YOUR QUERY");
if(mysql_num_rows($res) > 0) {
   $errors[] = "Exists.";
}
//PDO
$query = $db->prepare("YOUR QUERY");
$ret = $query->execute();
if($ret && $query->rowCount() > 0) {
   $errors[] = "Exists.";
}

查询

$query=mysql_query("SELECT *  from table WHERE userid = 1 AND badgeid = 1");

和PHP中的

if(mysql_num_rows($query)>0){
// whatever you want if match found 
}else{
echo "No match Found".
}
$sql = "SELECT COUNT(*) FROM `table_name` WHERE `user_id` = '1' AND `badge_id` = '1' "
$exists = mysql_query($sql) ; 
if(mysql_num_rows($exists) >= 1) {
      $errors[] = "Exists.";
}else {
   // doesn't exists.
}

尝试使用PDO代替旧的mysql_query()函数,因为它们自PHP 5.5以来已弃用。

对于简单查询:

$slcBadge = $con->query('SELECT badge_id FROM badges');
if ($slcBadge->rowCount() > 0) {
  $errors[] = 'Exists.';
}

或者如果您想从单个用户获取所有行:

$sqlBadge = 'SELECT id_badge FROM badges WHERE id_user = :idUser';
$slcBadge = $con->prepare($sqlBadge);
$slcBadge->bindParam(':idUser', $idUser, PDO::PARAM_INT);
$slcBadge->execute();
if ($slcBadge->rowCount() > 0) {
  $errors[] = 'Exists.';
}

注意,在第二段代码中,我使用了prepare()execute()而不是query()。这是为了保护您的查询免受SQL注入。通过使用prepare(),您可以修复查询的结构,这样如果用户输入查询字符串作为值,它将不会被执行。只有当用户可以输入将在查询中使用的值时,才需要准备一个查询,否则query()就可以了。查看注入链接获取更多详细信息

你的PHP版本很重要:

  • mysql_*函数在5.4
  • 中被弃用
  • 5.5起删除

建议实现PDO或Mysqli

mysql:此扩展现在已弃用,当通过mysql_connect(), mysql_pconnect()或通过隐式连接建立到数据库的连接时,将生成弃用警告:请使用MySQLi或PDO_MySQL代替当使用libmysql时,不再支持LOAD DATA LOCAL INFILE处理程序。以稳定性问题而闻名在MySQL 5.6.6+中增加了对SHA256认证的支持

参考请参见变更日志

构建查询

首先,我假设你正确地索引了你的字段,参考了我在Stack Exchange上发表的这篇文章。

其次,你需要考虑的效率取决于这个表的体积:做一个SELECT *是不好的做法,当你只有需要计算记录- mysql将缓存行计数,使你的SELECT Count(*)更快。有了索引,效率会更高。

我会简单地考虑这样的事情:

$dsn = 'mysql:host=127.0.0.1;dbname=DATABASE';
$db = new PDO($dsn, 'username', 'password', array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ''UTF8'''
));

注意:其中host=127.0.0.1如果您的用户通过localhost被授予访问权限,那么您需要声明localhost -或者将用户权限授予127.0.0.1

注意:对于SET NAMES,从5.3开始的PDO驱动程序也有一个bug(我相信),攻击者可以注入nullbytes和backspace bytes来删除删除,然后注入查询。

快速例子:

// WARNING: you still need to correctly sanitize your user input!
$query = $db->prepare('SELECT COUNT(*) FROM table WHERE user_id = ? AND badge_id = ?');
$query->execute(array((int) $userId, (int) $badgeId));
$total = $query->fetchAll();
$result = mysql_query("SELECT COUNT(*) FROM table WHERE userid = 1 AND badgeid = 1 LIMIT 1") or die(mysql_error());
if (mysql_result($result, 0) > 0)
{
   echo 'exist';
}
else
{
   echo 'no';
}