1

オブジェクト指向プログラミングに挑戦するのは初めてです。データベースからタイムスロットを繰り返そうとしていますが、結果が 1 つしか得られません。

タイムスロット テーブルには以下が含まれます。

10:00:00  
10:15:00
10:30:00

PHPクラスで:

 class booking {
     function __construct($mysqli) { 

     }

     function get_timeslot() {
         global $mysqli;

         $q = $mysqli->query("SELECT id_timeslot, times FROM timeslot");

         while($r = $q->fetch_array(MYSQLI_ASSOC)) :
             return $r['times'];
         endwhile;

         $mysqli->close();
     }
 }

ループ時間を表示する Web ページで:

 $booking = new booking($mysqli);

 <?php echo $booking->get_timeslot(); ?>

結果:

10:00:00
4

6 に答える 6

4

return は関数の値を返すため、返される値は 1 つだけです。試す

echo $r['times'].'<br/>';

また

 function get_timeslot(){
     global $mysqli;

     $q = $mysqli->query("SELECT id_timeslot, times FROM timeslot");
     $timeSlots = array();

     while($r = $q->fetch_array(MYSQLI_ASSOC))
     {
         $timeSlots[] = $r['times'];
     }

     $mysqli->close(); 
     return $timeSlots;
 }
于 2010-12-28T16:39:58.663 に答える
1

return $r['times']を使用しているため; ループ内。

これで問題が解決するはずです。

function get_timeslot(){
  global $mysqli;
  $returnArray = array();
  $q = $mysqli->query("SELECT id_timeslot, times FROM timeslot");
  while($r = $q->fetch_array(MYSQLI_ASSOC)) :
       $returnArray[] = $r['times'];
  endwhile;
  $mysqli->close(); 
  return $returnArray; // now that all results are fetched from DB, return array containing them
}

また、グローバルスコープを使用すると、どのプロセスでもグローバル変数にアクセスして変更できるため、クラスメソッド内またはその他の場所でグローバルキーワードを使用することはお勧めできません。DBオブジェクトにアクセスする他の手段(オブジェクトレジストリ、保護されたプロパティなど)を使用してみることをお勧めします。

また、whileループの代替構文(while():... endwhile;)を使用することはあまり読みやすくありませんが、それについて議論することはできます。

于 2010-12-28T16:46:38.820 に答える
1

return ステートメントは、while ループがそれ以上続行するのを停止し、関数を終了します。タイムスロットの配列を返すように関数を変更するか、データベースからの最初の結果のみを期待するようにロジックを変更する必要があります。

于 2010-12-28T16:39:56.200 に答える
1

ステートメントは、return呼び出されるとすぐに関数を終了します。代わりに、配列全体を返すよりも項目を配列に追加する必要があります。

class booking {

 function __construct($mysqli){}

 function get_timeslot(){
  global $mysqli;
  $q = $mysqli->query("SELECT id_timeslot, times FROM timeslot");

      while($r = $q->fetch_array(MYSQLI_ASSOC)) :
       $res[] = $r['times'];
      endwhile;
  $mysqli->close();
  return $res; 
 }
}
于 2010-12-28T16:43:13.337 に答える
1
 function get_timeslot() {
     global $mysqli;

     $q = $mysqli->query("SELECT id_timeslot, times FROM timeslot");

     while($r = $q->fetch_array(MYSQLI_ASSOC)) :
         // Cast to array
         $t[] = $r['times'];
     endwhile;

     $mysqli->close();
     // Return Array
     return $t;
 }


 // Calling the function
 $booking = new booking($mysqli);
 // Add print_r() as the return is now in an array format
 echo "<pre>".print_r($booking->get_timeslot(),true)."</pre><br />\n";
于 2010-12-28T16:45:40.083 に答える
0

これを試して:

class booking {
function __construct($mysqli){}
function get_timeslot()
{
    global $mysqli;
    $q = $mysqli->query("SELECT id_timeslot, times FROM timeslot");
    $return = '';
    while ($r = $q->fetch_array(MYSQLI_ASSOC)) :
        $return.= $r['times'] . '<br/>';
    endwhile;
    $mysqli->close();
    return $return;
}}
于 2010-12-28T16:42:43.703 に答える