mysql SELECT (необходимо подключиться к 2 таблицам и показать результаты для поиска) - PullRequest
0 голосов
/ 25 августа 2011

Я хочу соединить 2 таблицы в моем запросе, чтобы показать результаты.
У меня в первой таблице lastname, firstname и т. Д.
Во второй таблице у меня есть training, date ...

У меня также есть во второй таблице ссылка ID, которая связывает фамилию и имя с обучением и датой.
Поэтому, когда я создаю запись об обучении в базе данных, он использует один и тот же идентификатор для одного и того же человека.
Я хочу иметь возможность соединить обе таблицы в моем запросе и показать результаты, если я ищу lastname.
В нем также будет указан список всех пройденных им тренировок, если я щелкну там имя в поиске.
Я очень новичок в базе данных MySQL.
Я использую phpmyadmin для MySQL и запускаю базу данных localhost для тестирования ...
В настоящее время я могу искать в одной таблице и выводить результаты, но не могу найти объединение, чтобы связать их и получить список имен в качестве ссылки, чтобы показать там обучение. и иметь его имя там для распечатки вверху ... вот код, который я использую, который я получил из учебника.

    <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');  
  $id=@$_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>";
}
?>

Ответы [ 6 ]

1 голос
/ 25 августа 2011

1 - У вас есть отверстие для SQL-инъекции
Обязательно экранируйте все свои переменные, используя mysql_real_escape_string
И используйте для правильной кавычки строки внутри запроса _ (иначе mysql_real_escape_string не будет работать) _

$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- Если вы хотите получить результаты из нескольких таблиц, вам нужно объединиться

$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)";

Обычно вы не хотите выбирать все поля. Если вы явно укажете поля, которые вы хотите показать пользователю, запрос будет выполняться быстрее.

Вот хороший учебник по php и MySQL: http://www.tizag.com/mysqlTutorial/
А вот что происходит, если у вас есть дыры для SQL-инъекций: Как работает SQL-инъекция из комикса XKCD «Таблицы Бобби»?

1 голос
/ 25 августа 2011

Что вам нужно, это 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)";
1 голос
/ 25 августа 2011

Это не объединение, вы хотите присоединиться

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

Добавьте в конце свое предложение where

1 голос
/ 25 августа 2011

Я думаю, вы хотите что-то вроде этого:

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

, что потребует от вас передать значения $lastname и $firstname как отдельные переменные.

0 голосов
/ 25 августа 2011

Может быть, вы хотите что-то вроде этого:

SELECT username.* FROM username
JOIN training ON (training.id = username.id)
WHERE MATCH( lastname, firstname, location, created)    
      AGAINST('%$search%' IN BOOLEAN MODE)
0 голосов
/ 25 августа 2011
-- 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...