我不知道如何在PHP &MySQL;
基本上,我只想检查表中是否存在一行,如果存在,返回错误,例如:
$exists = MYSQL CODE TO CHECK HOW MANY ROWS INCLUDE BADGE_ID
if($exists >= 1)
{
$errors[] = "Exists.";
}
类似的东西,因为我正在编写一个小型商店脚本,我希望它检查以确保他们没有badge_id
。db的结构为user_id
和badge_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';
}