2009-02-27 6 views
0

Je suis un client SQL qui tente d'obtenir cette requête pour utiliser 2 tables.Utilisation de sql JOIN

tables & colonnes sont:

personne: department_id, nom , etc ...

département: department_id, dept_name, etc ...

J'ai un 'select' formulaire html que l'utilisateur va choisir un nom de dept, et j'ai besoin de mon script php pour retourner chaque personne avec un département_id correspondant. Voici mon code & requête jusqu'à présent, je serais reconnaissant de toute aide.


$search_dept = $_POST['search_dept']; 

$conn = odbc_connect($odbc_name, $user_name, $pass_wd); 

if ($conn) { 
    $query = "SELECT person.* 
        FROM department 
        JOIN person 
        ON department.department_id=person.department_id 
        WHERE department.name=$search_dept"; 

    if($result = odbc_exec($conn, $query)) { 

     echo '..stuff'; 
     while ($row = odbc_fetch_array($result)) { 
      ...echo stuff 
     } 
     echo '...stuff'; 
    } 

    else { 
     echo 'Query was unsuccessful'; 
    } 
} 

else { 
    echo 'Unable to connect to database'; 
} 
+0

Alors qu'est-ce qui ne fonctionne pas? Quelle plate-forme SQL utilisez-vous? –

+0

c'est une connexion odbc, mais le DB est un SQL SERVER 2005 db ... –

Répondre

4

Tout d'abord, vous allez dans le mauvais sens. Vous ne voulez pas exécuter une clause WHERE sur une colonne de type texte si vous pouvez l'éviter. Puisque votre table de personnes a déjà le département id comme une clé étrangère, vous voudrez utiliser cette valeur pour faire votre sélection. Cela signifie que vous devrez modifier votre élément select pour qu'il contienne les ID de département en tant que valeurs des options.

<!-- Example --> 
<select name="dept_id"> 
    <option value="1">Sales</option> 
    <option value="2">Support</option> 
    <option value="3">Fulfillment</option> 
</select> 

Alors maintenant, non seulement que la sélection brute se produisent plus rapidement puisque vous exécutiez contre une colonne indexée (vous avez fait un bon FK il est donc indexé, non?), Mais vous aussi enlever la jointure tout à fait! (qui est un autre coup de pouce à la vitesse de la requête)

// Here is injection-safe code for the ODBC driver 
$stmt = odbc_prepare("SELECT * FROM person WHERE department_id = ?"); 
$success = odbc_execute($stmt, array($_POST['dept_id'])); 

// Here is the old, non-secure version, but is db-driver agnostic 
$deptId = $_POST['dept_id']; // escape this please! 
$query = "SELECT * FROM person WHERE department_id = $deptId"; 
+0

Je ne suis pas un administrateur DB, donc je ne peux rien changer à propos des propriétés DB ... Je suis juste un singe de code essayant de faire fonctionner ce site avec le db ... mais j'aime votre solution ... –

+0

Cela ne vous oblige pas à modifier la base de données, mais vous devez modifier l'élément de sélection HTML. –

+0

k je l'ai eu ... merci! –

2

Essayez cette requête, assurez-vous également d'échapper toute entrée utilisateur. Que se passerait-il si l'utilisateur fournissait:

$_POST['search_dept']= "'; DROP TABLE person;"; 

N'avez jamais été poussée par userinput!

$search_dept = mysql_escape_string($_POST['search_dept']); //make sure to escape this! you can use other functions for this as well. I'm not sure if PDO has some. 
$query = "SELECT * 
       FROM person 
       JOIN department 
       ON department.department_id=person.department_id 
       WHERE department.name='$search_dept'"; 
+0

c'est un odbc d'un SQL SERVER DB ... y at-il une fonction d'échappement pour cela, ou puis-je encore utiliser la mysql_escape_string()? –

+0

Ce sont les guillemets simples dans la réponse de Pim qui sont la principale différence dans la requête ici. Assurez-vous de mettre des guillemets simples autour des types VARCHAR/TEXT string-esque lors de l'écriture de requêtes SQL. –

+0

Ou encore mieux, utilisez une requête paramétrée si c'est possible. Je ne suis pas un développeur PHP, mais j'espère que ce serait possible. –