2012-03-31 50 views
19

Esto es probablemente algo fácil de hacer, pero soy un aficionado y las cosas simplemente no funcionan para mí.MySql php: compruebe si Row existe

sólo quiero comprobar y ver si existe una fila en la que se muestra la lectureName $. Si existe una fila con $ lectureName en algún lugar, quiero que la función devuelva "asignado" si no, entonces debería devolver "disponible". Esto es lo que tengo. Estoy bastante seguro de que es un desastre. Por favor ayuda.

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"; 
    } 
} 

Cuando hago esto todo lo rendimiento posible, incluso cuando debería devolver asignado.

+0

Por favor, no escriba consultas como que debido a que usted tiene el problema de la inyección de SQL. Esto significa que un atacante puede manipular fácilmente su base de datos (http://php.net/manual/de/security.database.sql-injection.php). Para evitarlo, consulte http://at2.php.net/manual/de/function.mysql-real-escape-string.php para ver algunos ejemplos. –

+0

@Jasd ¿Por qué las páginas están en alemán? –

+1

Ahh lo siento, parece que copié los enlaces incorrectos, simplemente reemplace 'de' con 'en' dentro de la URL. –

Respuesta

18

Esto debería hacer el truco: simplemente limite el resultado a 1 fila; si una fila regresa al $lectureName es Asignado, de lo contrario es disponible.

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

formato incorrecto –

+1

jaja extra rizado llaves son para principiantes: P – quickshiftin

+0

Otra cosa que se me ocurre es que sería una buena idea marcar la columna 'lecture_name' como' UNIQUE' si solo se supone que hay una entrada por nombre de conferencia (que parece ser la intención). Esto hará cumplir la idea de la función 'checkLectureStatus' en el nivel de la base de datos, en lugar de solo los componentes de la aplicación que usan este método. – quickshiftin

30

La manera más fácil de comprobar si existe una fila:

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

No hay necesidad de meterse con matrices y nombres de campo.

+1

mysql_real_escape_string no tiene nada que ver con la seguridad. Sin embargo, siempre se debe usar para escapar de cada cadena puesta en consulta. Pero es el uso está limitado a cadenas entre comillas solo –

+0

Solo FYI, mysql_fetch_row devuelve una sola fila, por lo tanto, no es necesario LIMIT 1. – Vincent

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

Este es un buen enfoque si usted es partidario de implementar la lógica de la aplicación en el nivel de la base de datos; un paso de los procedimientos almacenados si me preguntas, pero una solución válida, no obstante. – quickshiftin

14

Use mysql_num_rows(), para comprobar si las filas están disponibles o no

$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

Si bien este es un enfoque sólido, aún así limitaría el resultado a 1 fila para un mejor rendimiento con el db. Aunque nunca 'debería' haber más de una ocurrencia de '$ lectureName' si reúno la intención de OP correctamente. – quickshiftin

+1

@quickshiftin, Correcto, se agregó un límite a la respuesta. – Starx

1

Si sólo quiere comparar una sola fila con $ lactureName a continuación, utilizar siguiente

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

sin embargo hay que utilizar alguna biblioteca de abstracción para el acceso a la base de datos
el código se convertiría en

function checkLectureStatus($lectureName) { 
    $res = db::getOne("SELECT 1 FROM preditors_assigned WHERE lecture_name=?",$lectureName); 
    if($res) { 
    return 'Assigned'; 
    } 
    return 'Available'; 
} 
+0

Eso es un uso gratuito de llaves en esas declaraciones if, y es que una variable global que veo ... Mayor visión en la capa de abstracción de db ... – quickshiftin

+0

No hay nada malo con las variables globales si se usan a propósito. Un desarrollador debe guiarse por el conocimiento, no por las supersticiones. –

+0

LOL Parece que alguien se siente lastimado. Entonces no hay campo para la discusión sensata. Que tengas un buen día :) –

5

Sólo una pequeña actualización para el puesto y las respuestas: mysqli_query se debe utilizar, no mysql_query.

mysqli_query

+2

Esto debería publicarse como un comentario y no como una respuesta. – nickhar

+3

¿Por qué obtuvieron dos votos favorables? –