2016-05-02 3 views
0

У меня возникла проблема с созданием функции PHP, которая может присваивать значения многомерному ассоциативному массиву на основе результатов SQL-запроса.Как использовать функцию для присвоения значений массиву из SQL-запроса

Я просмотрел некоторые другие вопросы по этой теме, но я не мог сказать, применимы ли ответы на меня. Мой вопрос казался более простым, чем другие вопросы. Я не уверен, как объяснить это словами, поэтому я попытаюсь объяснить код.

Скажем, у меня есть эта база данных с несколькими таблицами, которые содержат все виды информации о разных породах собак. Высота, вес, цвет и т. Д. Более 50 столбцов информации. Я хочу вывести 5 конкретных пород из этой базы данных на основе разных критериев поиска, но я хочу присвоить все одинаковые столбцы переменным массива. Поэтому вместо повторения этих длинных циклов while снова и снова, я хотел создать функцию, которая назначила бы эти переменные для меня.

Пример

$sql1 -> //Query for German Shepherd info 
$sql2 -> // Query for Golden Retriever info 
$sql3 -> // Query for Poodle info 
$sql4 -> //Query for Pit Bull info 
$sql5 -> // Query for Bulldog info 

$dogs = array(array()); // set up 2 level multi-array 

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

while ($rows = $sql1->fetch(PDO::FETCH_ASSOC)){ 
$dogs[1]['breed_name'] = $rows['breed_name']; 
$dogs[1]['height'] = $rows['height']; 
$dogs[1]['weight'] = $rows['weight']; 
$dogs[1]['country'] = $rows['country']; 
$dogs[1]['function'] = $rows['function']; 
etc .. etc .. etc.. 
} 
while ($rows = $sql2->fetch(PDO::FETCH_ASSOC)){ 
$dogs[2]['breed_name'] = $rows['breed_name']; 
$dogs[2]['height'] = $rows['height']; 
$dogs[2]['weight'] = $rows['weight']; 
$dogs[2]['country'] = $rows['country']; 
$dogs[2]['function'] = $rows['function']; 
etc .. etc .. etc.. 
} 
while ($rows = $sql3->fetch(PDO::FETCH_ASSOC)){ 
$dogs[3]['breed_name'] = $rows['breed_name']; 
$dogs[3]['height'] = $rows['height']; 
$dogs[3]['weight'] = $rows['weight']; 
$dogs[3]['country'] = $rows['country']; 
$dogs[3]['function'] = $rows['function']; 
etc .. etc .. etc.. 
} 

Я бы скорее просто написал функцию, которую я мог бы назвать для каждой породы по мере необходимости. Затем я мог сохранить функцию на странице внешних функций, которую я включил на любую страницу, над которой я работаю. Это сэкономит пространство и силы. Но я не могу найти HOW для этого. Кажется, это должно быть просто, но я, кажется, что-то упускаю.

Я до сих пор пробовал 2 разных способа, и не дал никаких результатов.

Покушение 1

//set up the function 
function setDog($dogs, $d) { 
$dogs[$d]['breed_name'] = $rows['breed_name']; 
$dogs[$d]['height'] = $rows['height']; 
$dogs[$d]['weight'] = $rows['weight']; 
$dogs[$d]['country'] = $rows['country']; 
$dogs[$d]['function'] = $rows['function']; 
etc .. etc .. etc.. 
} 

//call the function 
while ($rows = $sql1->fetch(PDO::FETCH_ASSOC){setDog($dogs, 1);} 
while ($rows = $sql2->fetch(PDO::FETCH_ASSOC){setDog($dogs, 2);} 
while ($rows = $sql3->fetch(PDO::FETCH_ASSOC){setDog($dogs, 3);} 
while ($rows = $sql4->fetch(PDO::FETCH_ASSOC){setDog($dogs, 4);} 
while ($rows = $sql5->fetch(PDO::FETCH_ASSOC){setDog($dogs, 5);} 

Но это не сработало (значения не были назначены на массив), поэтому я попытался переключения его

Покушение 2

//set the function 
function setDog($dogs, $d, $sql){ 

while ($rows = $sql->fetch(PDO::FETCH_ASSOC)){ 
$dogs[$d]['breed_name'] = $rows['breed_name']; 
$dogs[$d]['height'] = $rows['height']; 
$dogs[$d]['weight'] = $rows['weight']; 
$dogs[$d]['country'] = $rows['country']; 
$dogs[$d]['function'] = $rows['function']; 
etc .. etc .. etc.. 
} 

} 

//call the function 
setDog($dogs, 1, $sql1); 
setDog($dogs, 2, $sql2); 
setDog($dogs, 3, $sql3); 
setDog($dogs, 4, $sql4); 
setDog($dogs, 5, $sql5); 

Этот второй, казалось, с наибольшей вероятностью работал, но он по-прежнему не задавал никаких значений в моем массиве. Я проверяю, вызывая случайные переменные массива (height, country, breed_name), и все они выходят пустым.

echo $dogs[1]['breed_name']; 

Я чувствую себя так, или что-то в этом роде, должно быть возможно. Понятие кажется таким простым, но я должен что-то упустить. Может ли кто-нибудь помочь мне понять это?

EDIT !!

Я испортил свой пример в первый раз. Предполагалось включить аргумент $ d, но я просто скопировал и вложил кучу неправильного кода. Он должен быть исправлен.

+0

To mo diffy исходный массив '$ dogs', вы должны передать его [по ссылке] (http://php.net/manual/en/language.references.pass.php). Но весь ваш код кажется немного запутанным. Я., вы понимаете, что вы переопределяете один и тот же ключ массива? И почему вы передаете '$ d', чтобы функционировать, если вы его не используете? – fusion3k

+0

, используя только один индекс, недостаточно, существует много типов пуделей, вы не можете просто использовать '1', он просто перезапишет их и получит последний тип в конце, я бы предложил просто использовать предложение 'in', подайте пользовательскую функцию с помощью массива' poodle, bulldog', затем просто используйте уникальный идентификатор и назначьте его как ключ в своем массиве – Ghost

+0

DOH! Я испортил свой пример. В функции, где сказано 1, ДОЛЖНО сказать $ d. Я поменяю его. –

ответ

1

Чтобы изменить первоначальный $dogs массив, вы должны передать его функционировать by reference:

#    ↓ 
function setDog(&$dogs, $d, $sql ) 
{ 
    (...) 
} 

setDog($dogs, 1, $sql1); 

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

отметить также, что ваша функция выполняет while цикл, но он присваивает значения строк в одном массиве:

while ($rows = $sql->fetch(PDO::FETCH_ASSOC)){ 
    $dogs[$d]['breed_name'] = $rows['breed_name']; 

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

Конец примечания: вы назначаете ключи массива одинаковые БД имена полей, так что вы можете просто сделать таким образом:

while ($rows = $sql->fetch(PDO::FETCH_ASSOC)){ 
    $dogs[$d] = $rows; 
} 

Или - если возвращение запрос только один ряд:

function setDog(&$dogs, $d, $sql ) 
{ 
    $dogs[$d] = $sql->fetch(PDO::FETCH_ASSOC); 
} 

Как вы можете видеть, если запрос возвращает только одну строку, вы можете полностью удалить вызов функции и сделать это непосредственно в главном коде:

$dogs[1] = $sql1->fetch(PDO::FETCH_ASSOC); 
$dogs[2] = $sql2->fetch(PDO::FETCH_ASSOC); 
(...) 
+0

СПАСИБО! Это сработало отлично. Я не знал, что мне нужно передать массив по ссылке. Раньше я запускал функции с массивами, но я возвращал значения, а не устанавливал их. Поэтому я не знал, что есть разница в том, как я прошел массив. Спасибо огромное! –

Смежные вопросы