質問: true) { header("Location: ./top.php"); mysql_close($sql_connect); exit; } } ?> ``` 上記の部分「if ($sql_query))」の条件式でいけるかなと思ったのですが、SQL文自体にエラーがなかったので、条件式が成立してしまっている状態です。
回答: ソースコードの提示ありがとうございます。 > > require ('mysql_connect.php'); > > > はおそらく、mysql_connect()でmysqlに接続しているだけと仮定します。 回答とは関係ありませんが、重要なので先に2点、 **mysql_* 系の関数は古くて非推奨になっているので、使わないほうがいいです。** **また、現在のソースコードには深刻なSQLインジェクション脆弱性を抱えているので修正の必要があります。 具体的には攻撃者は任意のユーザに成りすましてログインすることが可能なコードになっています。** おそらく古い参考書やサイトを参考にされたかと思いますので、ここ1-2年くらいのサイト/参考書を参考にしなおされるのがいいかと思います。 質問に対する回答としては ``` select * from users_info where mail='petrov@t-answer.jp' AND password='' ``` これはSQL文としては正しいので、 ``` $sql_query = mysql_query("select * from users_info where mail='" . $mail . "' and password='" . $pass . "'"); ``` $sql_queryには結果セットが返却されます。 そのため、 ``` if($sql_query) ``` は常にtrueになります。 これを回避するには、$sql_queryをfetchした結果がfalseになるか、 `select count(*) from` のようなSQLにして、結果をfetchして件数が一件であることを確認するというのがよくある方法です。 今回試みようとされている 「ユーザの入力によって不正なSQL文が作られてしまうことを利用してエラーハンドリングを行う」 というアプローチは、そのままSQLインジェクション脆弱性を作りこんでしまう事になってしまうため、 ユーザが完全に信頼できる場合(例えばphpMyAdminの様に管理者以外は触らないことを前提にする場合)を除いては **セキュリティ上絶対にやってはいけないアプローチ** となります。