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

时间:2014-05-03 09:09:29

标签: php mysql

我不确定如何在PHP& MySQL的;

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

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

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

6 个答案:

答案 0 :(得分: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.";
}

答案 1 :(得分:0)

此查询

$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".

}

答案 2 :(得分:0)

$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';
}

答案 3 :(得分:0)

$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.
}

答案 4 :(得分:0)

尝试使用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 injection的查询。通过使用prepare(),您可以修复查询的构造,这样,如果用户输入查询字符串作为值,则不会执行该查询。如果用户可以输入将在查询中使用的值,则只需准备查询,否则query()就可以了。查看注射链接以获取更多详细信息。

答案 5 :(得分:0)

您的PHP版本非常重要:

  • mysql_*功能自 5.4
  • 起不推荐使用
  • 5.5
  • 起删除

建议实施PDOMysqli

  

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

提供的SHA256身份验证的支持

供参考,请参阅the changelog

构建查询

首先,我假设您正确索引字段refer to this article我在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\''
));
  

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

     

注意:   使用SET NAMES还有一个来自5.3的PDO驱动程序的错误(我相信),攻击者可以注入nullbytes和backspace字节来删除删除然后注入查询。

快速示例:

// 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();