コードから始めましょう
これはコントローラー下のアクションにログインするためのコードです
//登陆提交控制器 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'); } }
$ 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 であることを意味します
勉強になりました、ありがとうございます