2017-05-18 17 views
1

返品の種類で交換する必要があるのは何ですか?テキスト。 クエリで結果が返されない場合は、データベースオブジェクトを返すPHPメソッドの戻り値の型?

私は方法があるPHP 7.1に

を使用しています:manualから

public function retrieveSomething(int $id_user): WHAT? { 
    try { 
     $this->sql = 'SELECT * FROM tbl_users WHERE IdUser = :id_user'; 
     $stmt = $this->db->prepare($this->sql); 
     $stmt->bindValue(':id_user', $id_user, PDO::PARAM_INT); 
     $stmt->execute(); 
     $row = $stmt->fetch(PDO::FETCH_OBJ); 
     $stmt->closeCursor(); 
     return $row; 
    } catch (PDOException $e) { 
     throw $e; 
    } catch (Exception $e) { 
     throw $e; 
    } 
} 
+0

http://php.netとタイプ名をつけることでnullとして をマークすることができます戻ります/manual/en/pdostatement.fetch.php - 戻り値の型指定を残すことができます。 –

答えて

3

PDO::FETCH_OBJ:に対応 プロパティ名と匿名オブジェクトを返します。結果セットに返された列名

あなたはユーザーのコメントの中でいくつかの例があります:

だから、
object(stdClass)#6 (3) { 
    ["1"]=> 
    string(1) "1" 
    ["2"]=> 
    string(1) "2" 
    ["3"]=> 
    string(1) "3" 
} 

public function retrieveSomething(int $id_user): \stdClass { 
} 

...(私はここでテストにPHP/7を持っていない)動作するはずです。また

成功した場合に、この関数の戻り値はフェッチタイプによって異なります。いずれの場合も、にFALSEが返されます。

これを回避するには、例外をスローするようにPDOを構成する必要があります(これは明らかに既に行っていますが、単独では良い考えです)。

また、try/catchブロックを削除することをお勧めします。これらは完全に冗長です。ドキュメントから

+0

成功した場合のこの関数の戻り値は、フェッチタイプによって異なります。いずれの場合も、失敗するとFALSEが返されます。 –

+0

@AlexSlipknotあなたが正しいです、私は私の答えを修正します。 –

+0

また、失敗すると、例外がスローされます。だから、答えは正しいようです。 –

1

成功した場合に、この関数の戻り値はフェッチタイプによって異なります。いずれの場合も、失敗するとFALSEが返されます。 PDO :: FETCH_OBJ:

function retrieveSomething(int $id_user): stdClass { 

しかし、場合は何をフェッチ失敗します。これはにつながる

匿名オブジェクトを返しますか?その結果を返す前に結果をチェックして、ユーザーにエラーを表示させないようにすることができます。

1

最終的なコードを表示したいので、これは私自身の質問の投稿です。

public function retrieveSomething(int $id_user): ?\stdClass { 
    $this->sql = 'SELECT * FROM tbl_users WHERE IdUser = :id_user'; 
    $stmt = $this->db->prepare($this->sql); 
    $stmt->bindValue(':id_user', $id_user, PDO::PARAM_INT); 
    $stmt->execute(); 
    $row = $stmt->fetch(PDO::FETCH_OBJ); 
    $stmt->closeCursor(); 
    if ($row) { 
     return $row; 
    } 
    return null; 
} 

両方アルバロ・ゴンサレスDymen1正しい...戻り値の型がはstdClassですが、私ははstdClass \バックスラッシュを使用する必要がありました。私はComposerの自動ロードを使用している可能性があります。

クエリは結果を返しません場合は、戻り値はブール(偽)となり、この方法は、はTypeErrorを投げます。これを修正するには、?\ stdClassの疑問符を入れます。 PHPのドキュメントには、パラメータのための

型宣言を言うと値が今疑問符

PHP 7 New features

+0

私の答えに欠けているルート名前空間の区切りを修正しました。報告してくれてありがとう。ただし、PDOの例外を投げていない場合は、PDOの例外を捕捉することの重要性はさらに低くなります。 (好奇心から、 '? 'の構文は何ですか?私はマニュアルでそれを見つけることはできませんが、それにもかかわらず有効です)。 –

+0

@ÁlvaroGonzálezPHP例外の問題を修正しました...ありがとうございます。疑問符に関しては、「?」はnullableとしてマークするために使用されています...私の更新された答えを見てください。 – SandroMarques

+1

それはnull可能なリンクです(私はそれを逃したと告白します)。私はあなたがなぜそれらを再スローするために例外をキャッチするのか理解できませんが、これは単なるコードであり、例外や何かを記録したいと思います。 –

関連する問題