2014-02-03 4 views
0

У меня есть php-файл с именем choose.php, где внутри i echo некоторый HTML, т. Е. Элемент select.Вызов PHP-функций из одного и того же файла

Я использую PDO для заполнения элемента select из базы данных mysql.

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

код таким образом:

echo  '<select>'; 

       $sql = "SELECT name FROM people"; 
       $res = $conn->prepare($sql); 
       $res ->execute(); 

       while ($row = $res ->fetch()) 
       { 
        echo '<option value = "' . $row['name '] . '">' . $row['name '] . '</option>'; 
       } 

echo  '</select>'; 

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

function getnames() 
{ 
     $sql = "SELECT name FROM people"; 
     $res = $conn->prepare($sql); 
     $res ->execute(); 

     while ($row = $res ->fetch()) 
     { 
      echo '<option value = "' . $row['name '] . '">' . $row['name '] . '</option>'; 
     } 
} 

Почему косяк я вызвать метод внутри вторил выбора элемента?

echo  '<select>'; 
        getnames(); 
echo  '</select>'; 

Также как бы это сделать, поставив метод в другой файл php, чтобы он был аккуратным?

+0

пожалуйста вставьте точное сообщение об ошибке –

ответ

4

Почему я не могу назвать метод внутри эхо-выбранного элемента?

Потому что тело метода метода ссылается на $conn, которое предположительно является глобальной переменной, а не внутри области метода. Вы можете убедиться в том, что это проблема (и «исправить» его) с

function getnames() 
{ 
    global $conn; 
    // the rest as before 
} 

Теперь, хотя это сделает проблему уйти, что вы предлагаете здесь не хороший способ организовать вещи. Есть несколько вопросов:

  • getnames использует глобальную переменную («невидимая аргумент») - обратите внимание, что вы не имели бы основания задавать этот вопрос, если бы это было исправлено!
  • Имя метода вводит в заблуждение - оно не «получает» что-то, оно печатает HTML.
  • Этот метод неприменим для чего-либо другого, кроме его конкретной цели - если вы хотите сделать что-то еще с именами (например, распечатать таблицу), вам придется написать другой метод.
  • Вы чередуете прямой вывод HTML (тег <select>) с бизнес-логикой (запрос к базе данных). Лучше сделать всю бизнес-логику вперед (сохранить результаты, которые вам нужны в переменных), а затем сделать HTML все за один раз.

Все перечисленные являются серьезными недостатками выбранного подхода, и ни один из них не будет присутствовать в хорошо построенном приложении. Я предлагаю, чтобы вместо того, чтобы проблема исчезла, вам лучше будет обслуживать рефакторинг кода для решения этих проблем, и проблема будет исправлена ​​на пути.

Code Review бы отлично место, чтобы задать вопрос по линиям «У меня есть этот код и эта рекомендация - как бы я реализовать это правильно?» если вам нужна дополнительная помощь.

+1

Однако следует отметить, что использование глобальных переменных обычно не является подходящим решением, но проблема ... так что вы migth хотите изменить потока данных. Почему вы не просто добавляете параметр к функции, которая берет ресурс соединения? –

+1

@JohannesH .: Ещё редактирование ... сделано. – Jon

+0

@Jon Привет, Jon, это была самая точная проблема, я включил файл connection_class.php, который устанавливает соединение с базой данных в верхней части страницы и предполагает, что она будет глобальной, потому что. Вы должны будете простить меня, поскольку я изучал только PHP более чем через неделю. еще раз спасибо. Также Йоханнес. я попробую это предложение сейчас –

0

Вопросы, относящиеся Как вы загружаете файл, в котором определена функция getnames?Попробуйте использовать require_once и убедившись, что это не более одного раза - already defined означает, что он будет определен, и файл вызывается снова, таким образом, пытаясь определить его снова

4

Вы пытаетесь получить доступ к $conn переменной, которая не доступна в вашем функции. Чтобы получить доступ к $conn переменной внутри функции использовать глобальные, как показано ниже:

global $conn; 
+0

Или еще лучше, сделайте $ conn pass-in var для функции function: function getnames ($ conn) {'Использование globals - один из самых простых способов повесить себя (или будущих сопровождающих) – rICh

0

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

Так что ваш код в верхней части страницы

$sql = "SELECT name FROM people"; 
$res = $conn->prepare($sql); 
$res ->execute(); 
$outputData = ''; 
while ($row = $res ->fetch()){ 
    $outputData .= '<option value = "' . $row['name '] . '">' . $row['name '] . '</option>'; 
} 

Тогда

echo '<select>'.$outputData.'</select>'; 
Смежные вопросы