ホームページ > バックエンド開発 > PHPチュートリアル > ログインと登録でちょっとしたことをしたのですが、文字でログインするとエラーになってしまいます。

ログインと登録でちょっとしたことをしたのですが、文字でログインするとエラーになってしまいます。

WBOY
リリース: 2016-06-23 14:15:01
オリジナル
1010 人が閲覧しました

コードから始めましょう

これはコントローラー下のアクションにログインするためのコードです
​​

//登陆提交控制器    public function logAction()    {        //获取登录表单参数    	$userid = $this->getRequest()->getParam('userid');    	$password = $this->getRequest()->getParam('psd');    	//创建表模型并查询登录密码    	$table = new user();    	$where = 'userid ='.$userid;    	$row = $table->fetchRow($where)->toArray();    	//验证表单密码和数据库密码    	if($row['password'] == $password)    	{    		//创建全局变量session用户名id    		session_start();    		$_SESSION['userid'] = $userid;    		//显示登陆成功视图    		$this->render('logok');    	}    	else     	{    		//密码错误显示登录失败视图    		$this->render('logfailed');    	} 	    }
ログイン後にコピー

これはユーザーテーブルです
+--------+---------- +------ ----+
ユーザー名 | +--------+----------+-------- --+
| 010 | ロビン | -+

最初の登録プロセス 通常の 2 つのレコードはすべて正常に挿入できますが、ログイン時に最初のレコード 010 が正常にログインされます
2 番目のレコードを使用して Robin! でログインすると、エラーが発生します

ユーザー名を入力してフォームを送信すると、文字が含まれている場合はエラーが報告されますが、文字が含まれておらず数字のみの場合はエラーは報告されませんが、ジャンプ情報は表示されません
まず、それを分析しました。何気なくユーザー名とパスワードを書いてもジャンプしないのは fetchRow の戻り値が null だからです
でも、英語の文字を書くとエラーが発生するのはなぜですか??フォームパラメータも取得できて、テーブルモデルも問題ないはずです
ページの文字セット、mysql の文字セット、zend Studio の文字セットもすべて utf-8 に統一されています
$where 条件の書き方が間違っていませんか?番号を使用してログインすると、ジャンプは成功します
どうしてこのような奇妙な問題が発生するのでしょうか...私は経験が浅いので、専門家にアドバイスを求めなければなりません

私もテストしたところ、文字や特殊文字を含まない 010_010 のような文字列が見つかりました。送信すると、500 エラーも報告されました
この問題は本当に奇妙です。


ディスカッションに返信 (解決策)

$where = 'userid ='.$ userid と書く必要があります
$where = "userid = '$userid'";

010 は 10 になる可能性がありますが、010_010 は 010_010 のままです

$where = 'userid ='.$userid;

と記述する必要があります

$ where = "userid ='$userid'";
いいえ、それはまだ同じです.. フォームに渡されたユーザー名に文字が含まれている限り、エラーが報告されます..
この問題は本当に奇妙です

010 は 10 になる可能性がありますが、010_010 は 010_010 のままです

userid データ型私のデータベースで定義されているのは varchar(10) です
フォームパラメータを取得しましたが、文字列処理関数を使用していないのに、どうやって 010 が変更されたのでしょうか?
パラメータが間違って渡されたのではないかと心配し、意図的に出力しました。フォームを介してパラメータを渡すのに問題はないはずです
各クエリコマンドを出力して見てください。

各クエリコマンドを印刷して見てみましょう?


長い間取り組んできましたが、まだ原因が見つかりませんでしたが、今は他の方法で問題を解決しました

渡されたフォームパラメータには問題はありませんが、一度送信されると、 fetchrow() メソッドを実行するとクラッシュします

数字には問題ありませんが、文字が渡されるとエラーになります

その後、テーブル モデル アダプターを取得し、qutoeInto() メソッドを使用して受信パラメーターを処理します


その後、私はアダプターの query() メソッドを使用して SQL ステートメントを実行しましたが、例外は発生しませんでした

うまくいきましたが、最初に何をしたかがまだ見つかりませんでした。エラーの理由: おそらく問題は $where パラメーターにあります。 ...

データベース クエリ エラーかその他のエラーかを確認するためにデバッグしますか?

おそらく問題を見つけました

まず第一に、問題は確かに $where 条件にあります

後でデバッグし、アダプター quoteInto() メソッドを使用してフォームパラメータを処理し、割り当てました
$where = $msgAdapter-> ;quoteInto(" ?", $userid);

次に、$where を表示すると、数値でも文字でも、フォームで取得したパラメーターが '001' 'robin' のように一重引用符で囲まれていることがわかりました。 1階の人が言ったように、 quoteInto() メソッドを使用しないようにしました。
$where = 'userid ='.$userid;
$where = "userid ='$userid'"; と書きます。実際には quoteInto() メソッドで処理されるパラメータと同じではありません それは同じことを意味しますか?
デバッグ後に渡されました
しかし、上の階の投稿に投稿されたコードはなぜ数値パラメータを渡すことができますが、文字パラメータは渡せないのでしょうか??

SQL文の仕様が原因ではないかと推測しています

上記のコードではphp経由でmysqlに渡されるSQL文は引用符なしで行う必要がありますが、この時渡されるのは数字で渡されたパラメータは実行できますが、文字で渡されたパラメータは実行できません

次に、mysql を開いて 3 つの SQL ステートメントをそれぞれ入力すると、問題の原因がより明確になります


これらは、mysql で実行した 3 つのステートメントです
実行できます。単一引用符の有無にかかわらず、純粋な数値は mysql サーバーで実行できることがわかります
ただし、文字の値を MySQL サーバーで実行するには、その前に単一引用符で囲む必要があるというエラーが報告されています。この画像は不明な列 'robin' と呼ばれています。 不明な列です...
このエラーが何と呼ばれるかわかりません

結局のところ、これは依然としてアダプターを通じて呼び出されます。 ) メソッドを使用してパラメータを処理し、SQL ステートメントを構築します
私は以前は常に 001 002 のようなフィールド値を書いていました
この問題を見つけたことはありません...

そして具体的には、なぜ SQL ステートメントの For を使用せずに直接実行できるのですか数値は一重引用符で囲みます。階下からのより良い回答を待ちましょう

上記の $where = 'userid ='.$userid は $where = "userid ='$ userid' と書くべきであるのは当然です。 "; これは、文字を一重引用符で囲む必要があるという元の投稿者の問題に対する答えになるはずです。

varchar は引用符で囲む必要があります。 。 。それ以外の場合は数値として扱われます。

数字は、引用符の有無にかかわらず、数字です。引用符がなければ数値を表し、引用符を使用すると文字列を表すというだけです。弱い型の場合、この 2 つは同じ
文字であり、引用符で文字列を表し、引用符なしで名前を表します。特定の意味はコンテキストによって決まります

たとえば、

userid = robin

は不明な列 'robin' というエラーを報告します。テーブルには robin という名前のフィールドはありません

userid = 'robin'

だけが、userid の値が robin であることを意味します


勉強になりました、ありがとうございます

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート