2011-08-14 3 views
0

私はPHPでデータベースで動作するクラスを持っています。このクラスのAdd関数は次のとおりです。返された関数の結果が条件文に混乱しています

function Add($post_id) 
    { 
     if(!is_numeric($post_id)) 
     { 
      return 1181; 
     } 

     $query = "..."; 
     $result = mysql_query($query, $this->link); 
     return $result; 
    } 

また、フォームデータを取得してこのクラスに渡すページもあります。ページのコードは次のとおりです。

$result = $obj->Add($post_id); 

if($result == 1181) 
{ 
    echo 'invalid'; 
} 
else if($result) 
{ 
    echo 'success'; 
} 
else 
{ 
    echo 'error'; 
} 

返される値は1で、出力が「成功」でなければなりませんが、私は「無効」メッセージが表示されます。私が「無効」と「成功」条件文を入れ替えれば、すべてうまくいくが、私はこの問題が何であるか知りたいのですか?

+0

入力は何ですか?もし '$ post_id'が何であるのか分からなければ、どのように問題を推論するのでしょうか? –

+2

「1181」のような数字を返さずに、例外を使用する必要があるように思えます。その数字はどういう意味ですか? –

+0

@Tomalak Geret'kal: '$ post_id'は数字です。 SQLインジェクションを防ぐために、 '$ post_id'をチェックしてからいくつかのコードがあるので、例外からは使用しませんでした。すべて正常ですが、私はこの問題が何であるか分かりません... – Novice

答えて

5

var_dump($result);は良い出発点です。ブール値コンテキストでは1181はtrueに変換されるため、successが印刷されただけで、それが成功するとは思われません。

おそらく間違ってpost_idを渡します。警告と通知の表示を有効にします。クレイジーマジック定数を使用しないでください。falseを使用するか、例外をスローしてください。戻り値は常にmysql_queryであることを確認してください。

私が推測する必要はないので、進歩して有意義な質問をすることができます。

+0

+1:かなり。これは現在、この質問に対して可能な最良の答えです。 –

+0

1181は真ですが、私は等価演算子でそれをチェックします。戻り値が1であるため、この条件はfalseです。私はこのメソッドでエラー番号があるので、数字から使用されています。「無効なメール」です。私はそれらのすべてを偽りの価値で示すことはできません。もちろん、私はそれを例外を使用して変更しました。 – Novice

+1

@Novice: 'var_dump(true == 1181)'をアサートしてください。この回答は正しいです。期待した結果が得られるようにするには、厳密な等価演算子 'var_dump(true === 1181)'を使うべきです。 –

2

他の人がコメントに指摘しているように、この種のケースではExceptionsを使用する必要があります。ここに例があります。

function Add($post_id) 
{ 
    if(!is_numeric($post_id)) 
    { 
     throw new InvalidArgumentException('Argument should be numeric'); 
    } 

    $query = "..."; 
    $result = mysql_query($query, $this->link); 
    return $result; 
} 

try 
{ 
    $result = $obj->Add($post_id); 
} 
catch(InvalidArgumentException $e) 
{ 
    /* handle the invalid argument exception */ 
} 

if($result) 
{ 
    echo 'success'; 
} 
else 
{ 
    echo 'error'; 
} 

あなたがエラーコードを使用して主張すればまた、あなたがこれを使用する可能性があります:

function Add($post_id) 
{ 
    if(!is_numeric($post_id)) 
    { 
     throw new InvalidArgumentException('Argument should be numeric', 1181); 
    } 

    if($post_id <= 0) 
    { 
     throw new InvalidArgumentException('Argument should be larger than 0', 1182); 
    } 

    $query = "..."; 
    $result = mysql_query($query, $this->link); 
    return $result; 
} 

try 
{ 
    $result = $obj->Add($post_id); 
} 
catch(InvalidArgumentException $e) 
{ 
    switch($e->getCode()) 
    { 
     case 1181: 
      /* handle the invalid argument exception with code 1181 */ 
      break; 
     case 1182: 
      /* handle the invalid argument exception with code 1182 */ 
      break; 
     default: 
      /* handle other invalid argument exceptions */ 
      break; 
    } 
} 

最後に、他の人もコメントしているように、例外処理は、とは何の関係もない、としませんSQLインジェクションの防止に干渉します。

関連する問題