2011-08-25 7 views
0

Je souhaite connecter 2 tables dans ma requête pour afficher les résultats.
J'ai lastname, firstname etc dans le premier tableau.
Dans la deuxième table je training, date ...mysql SELECT (besoin de se connecter à 2 tables et afficher les résultats pour une recherche)

J'ai aussi dans la deuxième table une référence ID qui relie et prenom à lastname la formation et la date.
Chaque fois que je crée un enregistrement d'entraînement dans la base de données, il utilise le même ID pour la même personne. Je veux pouvoir connecter les deux tables dans ma requête et afficher les résultats si je recherche lastname.
Il énumérera également toute la formation qu'ils ont terminée si je clique sur leur nom dans la recherche qui a été lancée.
Je suis très nouveau dans la base de données MySQL. J'utilise phpmyadmin pour MySQL et exécute une base de données localhost à des fins de test ...
Je peux actuellement rechercher une seule table et afficher des résultats, mais je ne peux pas comprendre l'union pour les lier et avoir la liste des noms comme lien pour montrer la formation. et qu'il garde son nom en haut pour une impression ... voici le code que j'utilise que j'ai reçu d'un tutoriel.

<form> 
    <div align="right"> 
    <input type="button" value="Print Results" onClick="myprint()"> 
    </div> 
</form> 
<?php 

// TAKE THE INFORMATION FROM FORM. 
$search = $_GET['search']; 

// IF THERE IS NOT A KEYWORD GIVE AN ERROR 
if (!$search) 
echo "You didn't enter a keyword"; 
else 
{ 
    echo "<td>You searched for: <strong>$search </strong></td>"; 
    mysql_connect('localhost','loginid','password'); 
    mysql_select_db('trainingrecords'); 
    [email protected]$_GET['id']; 

    //QUERY IS THE CODE WHICH WILL MAKE THE SEARCH IN YOUR DATABASE. 
    //I WROTE AN EXPLANATION ABOUT IT AFTER THE CODE. 
    $query="SELECT * FROM username 
      WHERE MATCH(lastname, firstname, location, created) 
      AGAINST('%$search%' IN BOOLEAN MODE)"; 
    $result1 = MySQL_query($query); 
    if(!$result1) { 
    echo MySQL_error()."<br>$query<br>"; 
    } 
    if (MySQL_num_rows($result1) > 0) { 
    echo "<table width='750' align='center' border='1' 
      cellspacing='2' cellpadding='2'>"; 
    while($result2 = MySQL_fetch_array($result1)) { 

     //A short description from category. 
     $description = $result2['location']; 
     $searchPosition = strpos($description, $search); 
     $shortDescription = substr($description, $searchPosition, 150); 

     echo "<td><strong>{$result2['lastname']} 
      {$result2['firstname']}</td></strong><td> 
      $shortDescription</td><td>{$result2['created']}</td><tr/>"; 
    } 
    echo "</table>"; 
    } else { 
    echo "No Results were found in this category.<br>"; 
    } 
    echo "<br>"; 
} 
?> 

Répondre

1

1- Vous avez un trou d'injection SQL
Assurez-vous d'échapper à toutes vos variables en utilisant mysql_real_escape_string
et utiliser à la chaîne citation correctement dans la requête _ (mysql_real_escape_string autrement ne fonctionnera pas) _

$search = mysql_real_escape_string($GET['search']); 
.... 
$query="SELECT * FROM username 
     WHERE MATCH(lastname, firstname, location, created) 
     AGAINST('%".$search."%' IN BOOLEAN MODE)"; 
//   ^   ^quotes were already there, good! 

2- Si vous souhaitez obtenir des résultats de plusieurs tables, vous devrez faire une jointure

$search = "SELECT u.*, t.* FROM username u 
    INNER JOIN training t ON (u.id = t.user_id) 
    WHERE MATCH(lastname, firstname, location, created) 
     AGAINST('%".$search."%' IN BOOLEAN MODE)"; 

Normalement, vous ne voulez pas sélectionner tous les champs. Si vous indiquez explicitement les champs que vous souhaitez afficher à l'utilisateur, la requête s'exécutera plus rapidement.

Voici un tutoriel décent sur php et MySQL: http://www.tizag.com/mysqlTutorial/
Et voici ce qui se passe si vous avez des trous SQL-injection: How does the SQL injection from the "Bobby Tables" XKCD comic work?

+0

Merci Johan Cela fonctionne très bien! Maintenant, mon seul problème est ma recherche de chaîne. quand je cherche le nom de famille et s'il y a deux personnes avec le même nom de famille, cela les amène toutes les deux et quand je recherche le prénom nom de famille ensemble. il semble l'ignorer et tire juste les deux de toute façon. Comment puis-je l'obtenir pour faire correspondre uniquement le prénom et le nom de famille sur ma recherche. plutôt que de simplement chercher les deux et me donner tous les résultats? – yeahwhatever

+0

J'ai aussi du mal à commander la recherche par nom de famille ou celui que je choisis. Y at-il un moyen d'avoir ma table avec les en-têtes pour chaque champ que si vous cliquez sur eux, il les ordonne par ce champ? et avoir la valeur par défaut étant le nom de famille? – yeahwhatever

1

Je pense que vous voulez quelque chose comme ceci:

SELECT * FROM username, training 
    where username.lastname = $lastname and username.firstname = $firstname 
     and username.id = training.id; 

qui vous obligera à passer vos valeurs $lastname et $firstname comme variables distinctes.

1

Son pas l'union de son vous adhérez voulez

Select a.id,a.firstname,a.lastname,a.location,a.date,b.trainingdate 
from username a 
inner join 
training b on a.id=b.id 

Ajoutez votre clause where sur la fin

0
-- something basic like this? 

SELECT u.id, u.name, t.link 
FROM users u 
LEFT JOIN trainings t ON u.id = t.user_id 
WHERE u.id = 5 
0

Peut-être que vous voulez quelque chose comme ceci:

SELECT username.* FROM username 
JOIN training ON (training.id = username.id) 
WHERE MATCH(lastname, firstname, location, created)  
     AGAINST('%$search%' IN BOOLEAN MODE) 
1

Qu'est-ce que vous avez besoin est a JOIN

$query="SELECT * FROM username u LEFT JOIN training t on (t.userid = u.id) WHERE MATCH(lastname, firstname, location, created) AGAINST('%$search%' IN BOOLEAN MODE)"; 
Questions connexes