2013-04-30 2 views
0

Я работаю над активным классом записей, который используется для извлечения записей из базы данных, которая может содержать объединения.mysql_fetch_assoc vs iterative mysql_fetch_row & mysql_fetch_column

Теперь в моих тестах у меня были некоторые данные с именами общих столбцов, которые содержат разные значения, но когда я выполняю функцию mysql_fetch_assoc, она возвращает только один столбец общего имени и может потерять оставшиеся данные , Итак, я планирую заменить mysql_fetch_assoc двумя контурами: первый, чтобы получить имена столбцов (используя mysql_fetch_column), а второй - для получения данных (с двумя петлями, один вложенными в другой, который будет извлекать все данные , затем сгруппируйте его в массив, который будет возвращен), который будет содержать имя столбца и его родительскую таблицу (или если JOIN имеет синтаксис AS).

Но я обеспокоен тем, что это может быть неэффективным и может стоить довольно много времени на обработку, поэтому кто-то может уточнить эффективность обоих методов или если есть функция, такая как mysql_fetch_assoc, которая добавит ссылку на таблицу столбца?

Дополнительная

Хотя это с использованием библиотеки MySQL для PHP, я рассматриваю возможность расширение библиотеки в будущем по PDO инициативы, но я бы использовать подобный метод выше (с помощью getColumnMeta)

+0

, имеющий несколько столбцов в запросе с тем же именем, всегда будет давать вам проблемы. Короткий ответ - не делать этого. SQL имеет отличную функцию сглаживания, которая позволяет переименовывать столбцы в выходной набор записей именно для такого рода столкновений. например 'SELECT field AS alias'. Взлом проблемы в описанном вами способе может решить проблему, но будет медленным и не обойти тот факт, что запрос должен быть написан лучше в первую очередь. – Spudley

ответ

2

Прежде всего: стандартный «mysql_ удаляется, используйте mysqli_ вместо».

Во-вторых: трудно сказать, не видя ваш текущий код, но насколько необработанный sql идет, вы можете просто переименовать столбцы. Так что если у вас есть таблица users и таблицу contacts, вы можете сделать это:

select a.id, a.firstname as myfirstname, a.lastname as mylastname, 
    b.id, b.firstname, b.lastname 
from users a, contacts b 
where a.id=b.userid; 
+0

raw mysqli непригодный для использования с подготовленными операциями, обратите внимание –

+1

Использование функций 'mysql_xx': он уже заявил в вопросе о том, что он планирует переключиться на PDO в будущем, поэтому он четко знает об этой проблеме. Тем не менее, я дал вам +1 за правильный ответ, а не тот, который он попросил. – Spudley

2

Общее решение реальной задачи (не XY, который вы просили о) дает псевдонимы «общие» имена полей:

SELECT goods.id as gid, categories id as cid ... 

и так далее

Однако, это вряд ли будет проблемой, если вы используете свой второй подход с mysql_fetch_field() (который вы на самом деле имею в виду) и mysql_fetch_row()