Функция PHP внутри функции внутри цикла: S - PullRequest
0 голосов
/ 03 марта 2011

Во-первых, Такс, что взглянул на мой вопрос.

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

Вот функции, тогда я объясню, что мне нужно и с чем я сталкиваюсь.

Они, наверное, очень грязные, но я учусь и думал, что попробую нарядиться, а потом почистить.

function GetStation($id){

$x_db_host1="localhost"; // Host name
$x_db_username1="xxxx"; // Mysql username
$x_db_password1="xxxx"; // Mysql password
$x_db_name1="xxxx"; // Database name

// Connect to server and select databse.
mysql_connect("$x_db_host1", "$x_db_username1", "$x_db_password1");
mysql_select_db("$x_db_name1");

// SQL Query Setup for Station Name
$sql="SELECT * FROM stations WHERE ID = $id LIMIT 1";
$result=mysql_query($sql);

while($rows=mysql_fetch_array($result)){ 
$retnm = $rows['CallSign'];
}
mysql_close();
echo $retnm;
} // Closes Function



// List Delegates Function!!!!!!!!!!!!!!!!!!!
function ListDelegates(){

    $x_db_host1="xxx"; // Host name
    $x_db_username1="xxx"; // Mysql username
    $x_db_password1="xxxx"; // Mysql password
    $x_db_name1="xxxx"; // Database name

// Connect to server and select databse.
    mysql_connect("$x_db_host1", "$x_db_username1", "$x_db_password1");
    mysql_select_db("$x_db_name1");

    $q = "SELECT * FROM delegates";
    $result = mysql_query($q);
/* Error occurred, return given name by default */
    $num_rows = mysql_numrows($result);
    if(!$result || ($num_rows < 0)){
      echo "Error displaying info";
      return;
   }
   if($num_rows == 0){
      echo "There are no delegates to display";
      return;
   }
   /* Display table contents */

    echo "<table id=\"one-column-emphasis\" summary=\"Delegates\"><thead>";
    echo "<thead><tr><th>ID</th><th>Name</th><th>Station</th><th>Spec Req</th><th>BBQ</th><th>DIN</th><th>SAT</th><th>SUN</th></tr>";
    echo "</thead><tbody>";

    for($i=0; $i<$num_rows; $i++){
        $d_id  = mysql_result($result,$i,"DID");
        $d_name1 = mysql_result($result,$i,"DFName");
        $d_name2 = mysql_result($result,$i,"DLName");
        $d_name = $d_name1 . " " . $d_name2;
        $d_spec1  = mysql_result($result,$i,"DSpecRe");
        $StatNm  = mysql_result($result,$i,"DStation");
        $d_st_name  = GetStation($StatNm);

    if ($d_spec1=="0"){ $d_spec = "-"; }
    else {$d_spec = "<a href=\"javascript:void(window.open('http://xxxxxxx.xxx/xsreq.php?id=$d_id','','width=300,height=250,left=0,top=0,resizable=no,menubar=no,location=no,status=yes,scrollbars=no'))\">YES</a>"; }

        $d_bbq1  = mysql_result($result,$i,"Dbbq"); // BBQ
    if ($d_bbq1=="0"){ $d_bbq = "-"; }
    else {$d_bbq = "NO"; }  

        $d_din1  = mysql_result($result,$i,"Dconfdinner"); // Dinner
    if ($d_din1=="0"){ $d_din = "-"; }
    else {$d_din = "NO"; }  

        $d_sat1  = mysql_result($result,$i,"DConfSat"); // Saturday
    if ($d_sat1=="0"){ $d_sat = "-"; }
    else {$d_sat = "NO"; }  

        $d_sun1  = mysql_result($result,$i,"DConfSat"); // Sunday
    if ($d_sun1=="0"){ $d_sun = "-"; }
    else {$d_sun = "NO"; }  

    echo "<tr><td>$d_id</td><td><strong>$d_name</strong></td><td>$d_st_name</td><td>$d_spec</td><td>$d_bbq</td><td>$d_din</td><td>$d_sat</td><td>$d_sun</td></tr>";

   }
    echo "</tbody></table></br>";
}

Итак, я вывожу ListDelegates () на страницу, и она отображает красивую таблицу и т. Д.

В ListDelegates () я использую функцию GetStation ().

Это потому, что таблица ListDelegates () использует идентификатор станции, а не имя, поэтому я хочу, чтобы GetStation ($ id) выводил имя станции

Проблема, с которой я столкнулся, заключается в том, что, похоже, GetStation () выводит все имена при первом вызове функции, поэтому первая строка в таблице и не разбивается на каждую строку, а только по одной: S

Вот что я думаю (я, вероятно, ошибаюсь). ListDelegates () не вызывает GetStation () для каждой строки, он делает это один раз, даже если он находится в цикле. ??

Понятия не имею, должно ли это вообще сработать ... Я просто учусь исследовать, а потом пробую.

Пожалуйста, помогите мне, чтобы я мог вывести название станции

Ответы [ 4 ]

3 голосов
/ 03 марта 2011

В конце GetStation вам нужно изменить

echo $retnm;

на

return $retnm;

Вы печатаете имя изнутри функции GetStation, когда вынамерены сохранить его в переменной.В итоге происходит то, что результат GetStation эффективно echo 'отображается на экране за пределами любой строки таблицы.Содержимое, которое находится внутри таблицы, но не находится внутри ячейки таблицы, собирается в верхней части таблицы в браузере.Если вы хотите понять, что я имею в виду, просто просмотрите исходный код из браузера после загрузки страницы.

0 голосов
/ 03 марта 2011

как-то так, и, как предполагается, у вас должно быть соединение с базой данных, установленной где-то еще

function ListDelegates(){

    $x_db_host1="xxx"; // Host name
    $x_db_username1="xxx"; // Mysql username
    $x_db_password1="xxxx"; // Mysql password
    $x_db_name1="xxxx"; // Database name

    // Connect to server and select databse.
    mysql_connect("$x_db_host1", "$x_db_username1", "$x_db_password1");
    mysql_select_db("$x_db_name1");

    $q = "SELECT * FROM delegates";
    $result = mysql_query($q);
    /* Error occurred, return given name by default */
    $num_rows = mysql_numrows($result);
    if(!$result || ($num_rows < 0)){
      echo "Error displaying info";
      return;
   }
   if($num_rows == 0){
      echo "There are no delegates to display";
      return;
   }
   /* Display table contents */

    echo "<table id=\"one-column-emphasis\" summary=\"Delegates\"><thead>";
    echo "<thead><tr><th>ID</th><th>Name</th><th>Station</th><th>Spec Req</th><th>BBQ</th><th>DIN</th><th>SAT</th><th>SUN</th></tr>";
    echo "</thead><tbody>";

    for($i=0; $i<$num_rows; $i++){
        $d_id  = mysql_result($result,$i,"DID");
        $d_name1 = mysql_result($result,$i,"DFName");
        $d_name2 = mysql_result($result,$i,"DLName");
        $d_name = $d_name1 . " " . $d_name2;
        $d_spec1  = mysql_result($result,$i,"DSpecRe");
        $StatNm  = mysql_result($result,$i,"DStation");

        $d_bbq1  = mysql_result($result,$i,"Dbbq"); // BBQ
        $d_din1  = mysql_result($result,$i,"Dconfdinner"); // Dinner
        $d_sat1  = mysql_result($result,$i,"DConfSat"); // Saturday
        $d_sun1  = mysql_result($result,$i,"DConfSat"); // Sunday

        //$d_st_name  = GetStation($StatNm);

        $sql="SELECT * FROM stations WHERE ID = $StatNm LIMIT 1";
        while($rows=mysql_fetch_array($result)){ 
            $d_st_name = $rows['CallSign'];
        }


        if ($d_spec1=="0"){ $d_spec = "-"; }
        else {$d_spec = "<a href=\"javascript:void(window.open('http://xxxxxxx.xxx/xsreq.php?id=$d_id','','width=300,height=250,left=0,top=0,resizable=no,menubar=no,location=no,status=yes,scrollbars=no'))\">YES</a>"; }


        if ($d_bbq1=="0"){ $d_bbq = "-"; }
        else {$d_bbq = "NO"; }  


        if ($d_din1=="0"){ $d_din = "-"; }
        else {$d_din = "NO"; }  


        if ($d_sat1=="0"){ $d_sat = "-"; }
        else {$d_sat = "NO"; }  


        if ($d_sun1=="0"){ $d_sun = "-"; }
        else {$d_sun = "NO"; }  

        echo "<tr><td>$d_id</td><td><strong>$d_name</strong></td><td>$d_st_name</td><td>$d_spec</td><td>$d_bbq</td><td>$d_din</td><td>$d_sat</td><td>$d_sun</td></tr>";

    }
    echo "</tbody></table></br>";
}
0 голосов
/ 03 марта 2011

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

0 голосов
/ 03 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...