Использование mysql_query и mysql_fetch_array - PullRequest
2 голосов
/ 13 ноября 2009

Я пытаюсь выяснить, как правильно выбрать данные из моей базы данных. В любом случае работает, но какая разница; подробное объяснение?

$sql = mysql_query("SELECT * FROM _$setprofile");
while($row = mysql_fetch_array($sql)) {
    $username = $row['user'];
    $password = $row['pass'];
    echo "$username:$password";
}

против функция ниже ...

$sql = mysql_query("SELECT user,pass FROM _$setprofile");
while($row = mysql_fetch_row($sql)) {
    echo "$row[0]:$row[1]";
}

Это то, что я всегда хотел знать.

Ответы [ 3 ]

4 голосов
/ 13 ноября 2009

Разница в том, что вы переопределяете переменные в первом примере. Но вы могли бы просто сказать:

while(list($username, $password) = mysql_fetch_array($sql)) {
    echo "$username:$password";
}

Или вы можете извлечь хеш

while($row = mysql_fetch_assoc($sql)) {
    echo "{$row['username']}:{$row['password']}";
}

Правильный путь зависит от приложения или ваших предпочтений, я лично избегаю числовых индексированных массивов, если они мне не нужны. Кто хочет попытаться понять, какие данные в каком индексе находятся?

3 голосов
/ 13 ноября 2009

Внутри нет большой разницы. И порядковые позиции, и имена столбцов доступны в метаданных набора результатов в клиентском API MySQL, независимо от этого.

Что касается использования, оба могут быть полезны в различных обстоятельствах. Ссылка на столбцы по имени является более мнемонической, приводит к (полу) самодокументированному коду, позволяет изменять позицию или количество столбцов в запросе, не нарушая код и т. Д.

Но выборка по порядковому номеру иногда бывает слишком ручной. Например:

SELECT u.name, d.name FROM user u JOIN department d USING (dept_id)

Теперь у вас есть два столбца с одинаковым именем в наборе результатов. Если вы выбираете ассоциативный массив, один перезаписывает другой, потому что ассоциированный массив может иметь только одно значение на ключ. Итак, $row["name"] - это одно из имен, и вы не обязательно знаете, каким оно будет.

SELECT d.name, COUNT(*) FROM user u JOIN department d USING (dept_id) GROUP BY dept_id

Теперь у вас есть столбец, у которого нет псевдонима, и в зависимости от используемой вами марки СУБД он может автоматически придумать смешной псевдоним или просто использовать целое выражение в качестве ключа для массива Assoc. Так что в этом случае приятно иметь возможность использовать порядковый номер вместо имени столбца.

(Забавно, что мой стиль письма становится более неформальным и разговорчивым, когда я слушаю подкаст StackOverflow во время записи.)

3 голосов
/ 13 ноября 2009

Разница в том, что fetch_array извлекает массив, содержащий ОБА числовые и ассоциативные индексы (если вы не предоставите дополнительную опцию, чтобы сказать это иначе), тогда как fetch_row получает только числовые индексы, а fetch_assoc получает только ассоциативные индексы. Обычно вам не нужны оба.

Используйте fetch_assoc вместо fetch_array - ТОЛЬКО вы получите массив с ассоциативными индексами. Это означает, что он будет работать немного быстрее (он должен выполнять меньше работы), но код будет таким же понятным.

С функциональной точки зрения разница минимальна. Однако в первом случае проблема заключается в том, что вы извлекаете из базы данных больше, чем нужно (SELECT *). Обычно рекомендуется не выбирать больше, чем вам нужно.

...