0

こんにちは、MySQL データベースからデータを取得する関数に少し問題があり、結果を foreach ループで反復処理し、値が null かどうかを確認し、null の場合は別の値に置き換えます。

この関数の問題は、データを返した後、データベースから取得した 1 つのレコードしか表示できないことです。おそらく単純なことですが、それは私を超えています。

コントローラーまたはビューに渡す前にこれを行いたいと思います。たぶん、これは foreach ループでは不可能ですか? 私は何が欠けていますか?

これが私のコードの例です。

public function get_basic_user_data(){
    $sql = 'SELECT Account.First_Name, Account.Last_Name, Account.User_Name, Profile_Photos.Thumb_Url 
            FROM Account 
            LEFT JOIN Profile_Photos ON Account.idAccount = Profile_Photos.Account_Id 
            AND Profile_Photos.Active = 1
            WHERE Account.idAccount != ?';
    $account_id = $this->get_account_id();
    $data = $this->db->query($sql, $account_id);

    foreach($data->result() as $row){

            if($row->Thumb_Url == NULL){
                $image = base_url().'assets/images/no_photo_thumb.png';
            }else{
                $image = $row->Thumb_Url; 
            }


    $new_data = new stdClass;
    $new_data->First_Name = $row->First_Name;
    $new_data->Last_Name = $row->Last_Name;
    $new_data->User_Name = $row->User_Name;
    $new_data->Thumb_Url = $image;

    }   

    return $new_data;

}   

うまくいけば、誰かがこれで私を助けてくれますか? ありがとう!

4

4 に答える 4

1

現時点では、最後のデータ行を返しています。次のようにコードを変更して、その関数からすべての行の配列を返します。

$rows = array()
foreach($data->result() as $row){

    if($row->Thumb_Url == NULL){
        $image = base_url().'assets/images/no_photo_thumb.png';
    }else{
        $image = $row->Thumb_Url; 
    }


    $new_data = new stdClass;
    $new_data->First_Name = $row->First_Name;
    $new_data->Last_Name = $row->Last_Name;
    $new_data->User_Name = $row->User_Name;
    $new_data->Thumb_Url = $image;

    $rows[] = $new_data;
}   

return $rows;

このようにして、データベースから返されたすべての行が という名前の配列に追加され$rowsます。最後に、新しい配列を返す必要があります。

于 2013-01-25T08:02:33.177 に答える
0

foreach の反復ごとに $new_data が上書きされるため、最終的に関数が戻ると、最後にフェッチされた行のみが返されます。複数の行を返すには、すべての行を配列に格納してから、最後に配列を返すことができます。次のようになります。

public function get_basic_user_data(){
    $sql = 'SELECT Account.First_Name, Account.Last_Name, Account.User_Name, Profile_Photos.Thumb_Url 
            FROM Account 
            LEFT JOIN Profile_Photos ON Account.idAccount = Profile_Photos.Account_Id 
            AND Profile_Photos.Active = 1
            WHERE Account.idAccount != ?';
    $account_id = $this->get_account_id();
    $data = $this->db->query($sql, $account_id);

    $data = array();
    foreach($data->result() as $row){

        if($row->Thumb_Url == NULL){
            $image = base_url().'assets/images/no_photo_thumb.png';
        }else{
            $image = $row->Thumb_Url; 
        }


        $new_data = new stdClass;
        $new_data->First_Name = $row->First_Name;
        $new_data->Last_Name = $row->Last_Name;
        $new_data->User_Name = $row->User_Name;
        $new_data->Thumb_Url = $image;

        $data[] = $new_data;
    }   

return $data;

}   

この関数を使用できるようにするには、この関数を使用してオブジェクトの配列をループ処理するコードを変更する必要があります。

于 2013-01-25T08:11:55.303 に答える
0

繰り返しごとに $new_data を上書きしています。これを試して

$new_data = new stdClass
...
$all_data[] = $new_data;

コードで null 値をチェックする代わりに、SQL クエリで IFNULL ステートメントを使用することもできます。これによりロジックが少し分離されますが、この場合はそれだけの価値があるかもしれません。

于 2013-01-25T08:03:31.997 に答える
0

new_data 変数はループのすべてのステップで上書きされるため、関数は結果の最後の行のみを返します。関数の開始時に new_data を配列として宣言し、行を配列要素として追加します

...
$new_data[] = new stdClass;
...
于 2013-01-25T08:05:42.217 に答える