2013-05-22 4 views
-2

У меня есть то, что похоже на вопрос о mysql & PDO. Я поставил себе задачу о том, как начать использовать PDO вместо старых функций mysql * PHP.PHP MYSQL PDO - функция

Это немного сложно объяснить, но я сделаю сайт максимально эффективным (с точки зрения PHP в любом случае). Я нашел кучу хороших уроков о MySQL PDO, но мне не удалось найти решение этого.

Предположим, что я хочу регулярно запрашивать различные таблицы для всех данных, которые они содержат; Для этой цели я намерен создать функцию с одним аргументом - имя таблицы для запроса: Что-то вроде этого:

function getData($table) 
{ 
    global $db; 
    $SQL_query = "SELECT * FROM $table"; 
    $statement = $db->query($SQL_query); 
    $result = $statement->fetch(PDO::FETCH_NUM); 
    return $result; 
} 

Это работает отлично; однако функция возвращает только первую «строку» таблицы. Теперь вопрос: как заставить функцию возвращать все строки? Могу ли я попробовать что-то вроде этого:

function getData($table) 
{ 
    global $db; 
    $SQL_query = "SELECT * FROM $table"; 
      $statement = $db->query($SQL_query); 
      while ($row = $statement->fetch(PDO::FETCH_NUM) 
    { 
    return $result; 
      } 
} 

Я был бы признателен за любые советы/рекомендации и т.д. ... Если есть какие-либо рекомендации для такого рода желаемого поведения?

+0

Да, вы можете это сделать. В качестве альтернативы вы можете использовать ['fetchAll()'] (http://php.net/manual/en/pdostatement.fetchall.php) и перебирать результирующий набор, возвращаемый этой функцией. –

ответ

1

Ваша идея для этой функции совершенно неверна.

Как сказал Майк Брант, нет смысла выбирать все данные из таблицы - вы, вероятно, путаете базу данных с плоским файлом. У вас есть сила SQL на кончиках ваших пальцев, и было бы преступлением не использовать его!

Итак, заставьте вашу функцию принять SQL-запрос и параметры для него, связанные с требованием PDO.

function getData() 
{ 
    $global $db; 
    $params = func_get_args(); 
    $query = array_shift($args); 

    $stmt = $db->prepare($query); 
    $stmt->execute($params); 
    return $stmt->fetchAll(); 
} 

и теперь вы можете использовать его как этот

$rows = getData("SELECT * FROM t WHERE cat=?",$category); 

аккуратным, а?

Это было бы очень полезно и удобно.

+0

Если я читаю ваш код правильно, вы фактически предлагаете не использовать запрос внутри самой функции, а скорее передавать его функции как аргумент. Что касается сбора всей таблицы, я согласен, что она не может быть очень изящной. Спасибо за ваш пост! – TomasH

+0

Да, точно. Передача запроса в качестве аргумента функции сделает его гибким - вы сможете использовать любой запрос, который вам нужен, с помощью этой единственной функции. –

+0

Правильно ... Я намеревался что-то немного другое (имея один запрос для каждого типа запроса, отличающийся только таблицей), но это на самом деле еще более гибкое. Еще раз спасибо! – TomasH

1

Ответ заключается в том, что вы, вероятно, НЕ ХОТИТЕ возвращать все строки таблицы. Вероятно, вам лучше будет возвращать дескриптор инструкции вызывающей стороне для итерации. В противном случае вы загрузите всю таблицу в память, если вам не понадобится делать это в вашей программе. Это может быть не проблема, если все ваши таблицы не содержат столько данных, но, конечно, это будет память, как только вы начнете делать это на больших таблицах.

Например, если вы собираетесь просто выводить всю таблицу данных клиенту браузера, и предположим, что у вас есть таблица с 1000 строк, каждая из которых усредняет 1 Кбайт данных. Вам нужно будет прочитать 1 МБ данных в памяти, если вы используете подход, а только для хранения в среднем 1 кбайт в памяти, если вы разрешаете вызывающему абоненту проходить через результирующий набор.

+0

Не могли бы вы немного подробнее рассказать о «возвращаемом дескрипторе оператора вызывающему»? Вы имели в виду (похожий на «ваш здравый смысл»), чтобы передать запрос функции в качестве аргумента? Благодаря! – TomasH

+0

@TomasH Нет, я думаю, что @YourCommonSense имеет очень хорошее предложение о том, чтобы сделать вашу функцию более гибкой, учитывая возможность отправки различных функций и параметров.Тем не менее я предполагаю, что не всегда может быть хорошей идеей загрузить весь набор результатов в память через 'fetchAll()' или выполнить итерацию по всему набору результатов, а затем вернуть потенциально большой массив данных. Я предлагаю вам вернуть объект PDOStatement коду, вызывающему функцию, чтобы этот код мог решить, как он обработает результирующий набор. –

+0

ОК, это тоже очень интересно. Я подумаю, могу ли я что-нибудь придумать :) – TomasH