MySql php:检查行是否存在
这可能是一件容易的事情,但我是一个业余爱好者,事情并不适合我。MySql php:检查行是否存在
我只是想检查$ lectureName显示的行是否存在。如果一行存在$ lectureName中的某处,我希望该函数返回“assigned”,否则它应该返回“available”。这是我的。我相当确定它一团糟。请帮忙。
function checkLectureStatus($lectureName)
{
$con = connectvar();
mysql_select_db("mydatabase", $con);
$result = mysql_query("SELECT * FROM preditors_assigned WHERE lecture_name='$lectureName'");
while($row = mysql_fetch_array($result));
{
if (!$row[$lectureName] == $lectureName)
{
mysql_close($con);
return "Available";
}
else
{
mysql_close($con);
return "Assigned";
}
}
当我这样做时,所有返回可用,即使它应该返回分配。检查
这应该是诀窍:只限制结果为1行;如果一行回来$lectureName
是指定,否则它是可用。
function checkLectureStatus($lectureName)
{
$con = connectvar();
mysql_select_db("mydatabase", $con);
$result = mysql_query(
"SELECT * FROM preditors_assigned WHERE lecture_name='$lectureName' LIMIT 1");
if(mysql_fetch_array($result) !== false)
return 'Assigned';
return 'Available';
}
相当不好的格式化 – 2012-03-31 05:21:07
lol额外的大括号适用于初学者:P – quickshiftin 2012-03-31 05:25:02
另一件事发生在我身上的是它如果每个讲座名称只有一个条目(这似乎是意图),那么将'lecture_name'列标记为'UNIQUE'是一个好主意。这将在数据库级执行'checkLectureStatus'函数的思想,而不仅仅是使用此方法的应用程序的组件。 – quickshiftin 2012-03-31 05:27:14
最简单的方法,如果行存在:
$lectureName = mysql_real_escape_string($lectureName); // SECURITY!
$result = mysql_query("SELECT 1 FROM preditors_assigned WHERE lecture_name='$lectureName' LIMIT 1");
if (mysql_fetch_row($result)) {
return 'Assigned';
} else {
return 'Available';
}
没有必要惹阵列和字段名。
mysql_real_escape_string与安全无关。尽管如此,它必须始终用于逃避每个查询字符串。但它的用途仅限于引用字符串 – 2012-03-31 05:40:18
只是FYI,mysql_fetch_row返回一行,因此不需要限制1. – Vincent 2016-05-06 16:41:02
$result = mysql_query("select if(exists (SELECT * FROM preditors_assigned WHERE lecture_name='$lectureName'),'Assigned', 'Available')");
如果您是在数据库级别实现应用程序逻辑的倡导者,这是一个很好的方法;如果你问我,离存储过程只有一步之遥,但仍然是有效的解决方案。 – quickshiftin 2012-03-31 05:45:08
使用mysql_num_rows(),或者检查是否行可用,但不是
$result = mysql_query("SELECT * FROM preditors_assigned WHERE lecture_name='$lectureName' LIMIT 1");
$num_rows = mysql_num_rows($result);
if ($num_rows > 0) {
// do something
}
else {
// do something else
}
尽管这是一个可靠的方法,但我仍然将结果限制为1行,以获得更好的性能。尽管如果我正确地收集OP的意图,那么从来没有'应该'多于'$ lectureName'的一个事件。 – quickshiftin 2012-03-31 05:27:33
@quickshiftin,正确,增加了对答案的限制。 – Starx 2012-03-31 05:48:27
如果你只是想$ lactureName比较只有一排,然后使用以下
function checkLectureStatus($lectureName)
{
$con = connectvar();
mysql_select_db("mydatabase", $con);
$result = mysql_query("SELECT * FROM preditors_assigned WHERE lecture_name='$lectureName'");
if(mysql_num_rows($result) > 0)
{
mysql_close($con);
return "Assigned";
}
else
{
mysql_close($con);
return "Available";
}
}
function checkLectureStatus($lectureName) {
global $con;
$lectureName = mysql_real_escape_string($lectureName);
$sql = "SELECT 1 FROM preditors_assigned WHERE lecture_name='$lectureName'";
$result = mysql_query($sql) or trigger_error(mysql_error()." ".$sql);
if (mysql_fetch_row($result)) {
return 'Assigned';
}
return 'Available';
}
但是你必须使用一些抽象库为数据库访问。
代码将成为
function checkLectureStatus($lectureName) {
$res = db::getOne("SELECT 1 FROM preditors_assigned WHERE lecture_name=?",$lectureName);
if($res) {
return 'Assigned';
}
return 'Available';
}
在这些if语句中,这是对花括号的一些无端使用,并且是我看到的全局变量...关于db抽象层的主要洞察.. – quickshiftin 2012-03-31 05:47:58
如果全局变量有意使用,则没有任何问题。开发者应该以知识为导向,而不是迷信。 – 2012-03-31 05:57:10
大声笑似乎有人感觉受伤。所以没有理由进行合理的讨论。祝你有个愉快的日子:) – 2012-03-31 05:58:26
只是为了职位和答案一个小更新: mysqli_query使用,应不会的mysql_query。
这应该作为评论发布,而不是答案。 – nickhar 2012-12-10 22:32:31
为什么这会得到两个upvotes? – 2014-06-13 04:02:43
请,因为你有SQL注入的问题,不要键入这样的疑问。这意味着攻击者可以轻松地操纵数据库(http://php.net/manual/de/security.database.sql-injection.php)。为了避免它看到http://at2.php.net/manual/de/function.mysql-real-escape-string.php的一些例子。 – 2012-03-31 05:23:23
@Jasd为什么页面是德文的? – 2014-02-23 17:25:07
对不起,好像我复制了错误的链接,只需在URL中将'de'替换为'en'即可。 – 2014-02-23 19:24:12