Использование sql JOIN - PullRequest
       4

Использование sql JOIN

0 голосов
/ 27 февраля 2009

Я sql noob, пытаясь заставить этот запрос использовать 2 таблицы.

таблицы и столбцы:

лицо: department_id, название, и т.д ...

отдел: department_id, dept_name, и т.д ...

У меня есть html-форма select, из которой пользователь выберет имя dept_name, и мне нужен мой php-скрипт, чтобы вернуть каждому человеку с подходящим идентификатором департаментом Вот мой код и запрос, я бы порекомендовал любую помощь.


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

Ответы [ 2 ]

4 голосов
/ 27 февраля 2009

Прежде всего, вы идете об этом неправильно. Вы не хотите выполнять предложение WHERE для столбца текстового типа, если можете избежать этого. Поскольку в вашей таблице персон в качестве внешнего ключа уже указан департамент_ид, вы захотите использовать это значение для выбора. Это означает, что вам придется изменить свой элемент select, чтобы он содержал идентификаторы отделов в качестве значений параметров.

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

Так что теперь не только простой выбор будет происходить быстрее, так как вы будете выполнять для индексированного столбца (вы сделали его правильным FK, чтобы он был проиндексирован, верно?), Но вы также полностью удалите соединение ! (что является еще одним повышением скорости запроса)

// 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";
2 голосов
/ 27 февраля 2009

Попробуйте этот запрос, также убедитесь, что вы не используете ввод пользователя. Что если пользователь предоставит:

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

Никогда не вводите данные пользователя!

$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'";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...