2012-03-31 77 views
19

这可能是一件容易的事情,但我是一个业余爱好者,事情并不适合我。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"; 
    } 
} 

当我这样做时,所有返回可用,即使它应该返回分配。检查

+0

请,因为你有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

+0

@Jasd为什么页面是德文的? – 2014-02-23 17:25:07

+1

对不起,好像我复制了错误的链接,只需在URL中将'de'替换为'en'即可。 – 2014-02-23 19:24:12

回答

18

这应该是诀窍:只限制结果为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'; 
} 
+9

相当不好的格式化 – 2012-03-31 05:21:07

+1

lol额外的大括号适用于初学者:P – quickshiftin 2012-03-31 05:25:02

+0

另一件事发生在我身上的是它如果每个讲座名称只有一个条目(这似乎是意图),那么将'lecture_name'列标记为'UNIQUE'是一个好主意。这将在数​​据库级执行'checkLectureStatus'函数的思想,而不仅仅是使用此方法的应用程序的组件。 – quickshiftin 2012-03-31 05:27:14

30

最简单的方法,如果行存在:

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

没有必要惹阵列和字段名。

+1

mysql_real_escape_string与安全无关。尽管如此,它必须始终用于逃避每个查询字符串。但它的用途仅限于引用字符串 – 2012-03-31 05:40:18

+0

只是FYI,mysql_fetch_row返回一行,因此不需要限制1. – Vincent 2016-05-06 16:41:02

2
$result = mysql_query("select if(exists (SELECT * FROM preditors_assigned WHERE lecture_name='$lectureName'),'Assigned', 'Available')"); 
+1

如果您是在数据库级别实现应用程序逻辑的倡导者,这是一个很好的方法;如果你问我,离存储过程只有一步之遥,但仍然是有效的解决方案。 – quickshiftin 2012-03-31 05:45:08

14

使用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 
} 
+0

尽管这是一个可靠的方法,但我仍然将结果限制为1行,以获得更好的性能。尽管如果我正确地收集OP的意图,那么从来没有'应该'多于'$ lectureName'的一个事件。 – quickshiftin 2012-03-31 05:27:33

+1

@quickshiftin,正确,增加了对答案的限制。 – Starx 2012-03-31 05:48:27

1

如果你只是想$ 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"; 
    } 
} 
0
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'; 
} 
+0

在这些if语句中,这是对花括号的一些无端使用,并且是我看到的全局变量...关于db抽象层的主要洞察.. – quickshiftin 2012-03-31 05:47:58

+0

如果全局变量有意使用,则没有任何问题。开发者应该以知识为导向,而不是迷信。 – 2012-03-31 05:57:10

+0

大声笑似乎有人感觉受伤。所以没有理由进行合理的讨论。祝你有个愉快的日子:) – 2012-03-31 05:58:26

5

只是为了职位和答案一个小更新: mysqli_query使用,应不会的mysql_query。

mysqli_query

+2

这应该作为评论发布,而不是答案。 – nickhar 2012-12-10 22:32:31

+3

为什么这会得到两个upvotes? – 2014-06-13 04:02:43