in 'where clause'のエラーの理由

このQ&Aのポイント
  • 質問文章では、DBConnクラスとメインのPHPコードを使用してデータベースの呼び出しを行っています。
  • エラーの原因は、抽出条件で使用されているフィールド名が存在しないためです。
  • 特に、POSTで受け取った値を使用してWHERE句を作成している部分が問題です。
回答を見る
  • ベストアンサー

in 'where clause'のエラーの理由

まず最初に、呼出されるdb.phpの一部 <? class DBConn { var $dbhost="でーたべーすのURL"; var $dbuser,$dbpasswd,$db,$connect; function DBConn($db="データベース名",$dbuser="ユーザー名",$dbpasswd="パスワード"){ $this->dbuser=$dbuser; $this->dbpasswd=$dbpasswd; $this->db=$db; $this->connect=mysql_connect($this->dbhost,$this->dbuser,$this->dbpasswd); mysql_select_db($this->db,$this->connect); } function getResult($query){ $result[result]=mysql_query($query,$this->connect) or die(mysql_error()); $result[count]=@mysql_num_rows($result[result]); return $result; } function getSelect($field,$table,$where){ $query="select $field from $table $where;"; $result=$this->getResult($query); return $result; } ここからメインのPHP <?php $in = ""; if($_SERVER['REQUEST_METHOD'] == "POST") { $in = $_POST; }else{ $in = $_GET; } include "../base/db.php"; $db=new DBConn(); $temp_result=$db->getSelect("*","main","where username=$in[username]"); 書き出しでこのようにしているのですが、 これを呼出す前ページで<input type="text" name="username">としてPOSTしてやると Unknown column 'abcd' in 'where clause' というエラーが出ます。(abcdは前ページで適当に入力した文字) $temp_result=$db->getSelect("*","main",""); このように抽出条件無しの場合、問題なくデータは全て取得でき、 $temp_result=$db->getSelect("*","main","where username=$in[test]"); とか $temp_result=$db->getSelect("*","main","where test=$in[test]"); のように、抽出条件部分を実際にフィールド名として存在する別の名前を入れると You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 このようなエラー表示になります ネットで調べていたら、usernameが予約語だと書いてあるページがあったので`で括ってやったりもしましたが結果は同じです データベースの呼出はできてますし、抽出条件がなければデータが取得できることも確認しています。 データベースの指定テーブル内に抽出条件となるフィールドがあることも間違いありません。 どこが悪くてこのようなエラーになっているのでしょうか? 基本的な形式そのものは過去に作った物をコピペしてからはじめているので、余計にエラーの理由が分かりません。 あれこれと何時間も試しましたがどうにも解決できません。 どなたかお助けください。

  • choei
  • お礼率63% (286/451)
  • PHP
  • 回答数6
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • 1minn
  • ベストアンサー率57% (52/90)
回答No.5

$temp_result=$db->getSelect("*","main","where username=". $in['username']); こうじゃない? もしくは $temp_result=$db->getSelect("*","main","where username={$in['username']}"); とか? って思ったけど・・・・ $temp_result=$db->getSelect("*","main","where username='". $in['username'] ."'"); たぶんこれかな?

choei
質問者

お礼

回答頂き、誠にありがとうございます。 教えて頂いたもの全てと、'を`に変えたもの、それを組み合わせたものと試してみましたが、どれもエラーになってしまいます。 $temp_result=$db->getSelect("*","shop_user","where username=". $in[`username`] ."`"); $temp_result=$db->getSelect("*","shop_user","where username=". $in['username'] ."`"); でやった場合は、 Unknown column '' in 'where clause' このタイプのエラーが、 それ以外の入力方法でした場合は You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 (''の部分は記述内容により違います) のエラーが出てしまいます。 1行目は <?php としていますが、そこに問題があるという意味なのでしょうか? サーバーの設定を確認したところMySQLのバージョンは5.0.51a、PHPのバージョンは4.4のようです。 また、PHPはPHP5.2.8やPHP5.3.5に変更することはできます。

その他の回答 (5)

  • 1minn
  • ベストアンサー率57% (52/90)
回答No.6

5です。 コピペしてやってみましたか? 私が書いたものとは微妙にちがってるようですが・・・ また、そのエラーはSQLに対してのものです。 エラーメッセージが英語なので、理解しづらいとは思いますが、読み解かないとまた同じ壁にすぐぶち当たる事になりますよ。

choei
質問者

お礼

度々の回答ありがとうございます。 コピペでももちろん試しました。 過去に見よう見まねで作ったPHPがあってそれを参考にやっていたのですが、それのときは予約語keyを``(バッククオート)で括ったこともあったので、''(シングルクオート)のタイプとバッククオートのタイプと両方試したという意味でした。 もう一度過去に作った物をいろいろ見返してみましたが、 $temp_result=$db->getSelect("*","main","where username=$in[test]"); という形で作ってある物 $temp_result=$db->getSelect("*","main","where username='$in[test]'"); という形で作ってある物の両方があり、望むように動いてくれているのですが・・・何が悪いのかさっぱり検討が もう他のサンプルコード公開しているページなどいろいろ見回って勉強します。

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.4

残念ですが、まず基礎を抑えた方がいいです。 PHP: 配列 - Manual http://php.net/manual/ja/language.types.array.php 発行される最終のSQLもちゃんと確認してください。

choei
質問者

お礼

ご指摘のサイトはPHPを調べるとき必ず出てくるので、いろいろなページに飛びならが必ず目を通していますが、ここで何を言っているのかなかなか理解できないため皆さんにお尋ねしています。 申し訳ありませんが、これだけではこのURLのどこの部分を指摘されているのか分かりません。 何が問題かご存じでしたら「ここをこうすれば」と具体的に教えて頂けましたら非常にうれしいのですが、ご存じないのでしょうか。 知らなければいつまで経っても解決できない、でも非常に初歩的な入力も簡単なことだと想像するのですが・・・

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

>abcdはPOSTで送る前のform内のinputで適当に打っただけの文字ですから、これにはおそらく何の意味も持たないと思います。 え?? abcdと打ったとしたら、$in[test](なのか$in[username]なのかよくわかりませんが) の部分が abcd と展開されて実行されることになるのですよね? それで最終的に where username = abcd となっているから >Unknown column 'abcd' in 'where clause' ってなるんですよね? なんで何の意味も持たなくなっちゃうんでしょう・・・ >where username='$in[username]'としてみたところ >単なる文字列として認識されてしまったようです。 ようです。ではなくて、getResultの中ででも実際に実行されるSQLを出力してみて確認してはどうでしょうか。 自分が想定しているどおりのSQLになっていますか? 確認できる事象は確実に確認することが大事だと思います。 バシッと解決方法を回答できずに申し訳ないです。

choei
質問者

お礼

回答ありがとうございます。 が、で、結局どうすればいいのでしょうか。 >確認できる事象は確実に確認することが大事だと思います。 数値を変えてみたり、コードをいじくってみたり、もちろん自分でいろいろ思い当たる事象を確認してみたりしたつもりです。 ちょっと分からないからといって聞いたわけではありません。 まさかこんなところでつまずくとは思っておりませんでしたが、この初歩的なところから一晩費やしてしまっております。

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

DBで実行されるSQLが select ~ where username= abcd となっているのだと思います。 これではabcdはカラム名だと判断されてしまうので、 select ~ where username= 'abcd' と引用符でくくるようにしないといけないのではないでしょうか? ただ、申し訳ないのですがphpは全然しらないので、 具体的にソースをどのように変更すればいいのかは回答できません・・・ 単純に $temp_result=$db->getSelect("*","main","where username='$in[test]'"); これで済むのですかね?

choei
質問者

お礼

ありがとうございます。 abcdはPOSTで送る前のform内のinputで適当に打っただけの文字ですから、これにはおそらく何の意味も持たないと思います。 念のため where username=`$in[username]` としてみたところ Unknown column '' in 'where clause' というエラーが出、 where username='$in[username]'としてみたところ エラーは出なかったものの、きちんと処理されたか確認するためのトラップをそのままスルーしたので、単なる文字列として認識されてしまったようです。

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.1

ロジックの前にとりあえず 連想配列 × $array[key] ○ $array['key'] ○ "{$array['key']}" SQL SELECT * FROM table WHERE string_column = 'string';

choei
質問者

お礼

回答ありがとうございます。 $array[`key`]でやったところ Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in というエラーになりました。 また、これまで、そして他のところでも$array[key]の形でやって何もエラーは出ていません。 keyは予約語ですからkeyに関しては``で括る必要があることは知ってますが。。。 ちなみにもう一度元に戻してやってみたところ You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 と、最初の質問のエラーとは違うエラーが出ました。 他を変えているわけでもないのに、なぜ違うエラーが出るのかますます混乱です。

関連するQ&A

  • PHP5 DB問い合わせ時のエラーについて

    PHP5について質問です。 よろしくお願いします!! 下記のソースでDBへ問い合わせするとエラーがでます。 $this->dbConn=DB::connect("mysql://root:@localhost/a_db"); $this->link=mysql_connect("localhost","root","") or die("MSQLの接続に失敗"); $this->mysql=mysql_select_db(a_db) or die("データベースとの接続に失敗"); $this->query= "select * from customer_table01"; var_dump($this->query); $this->result=mysql_query($this->query) or die("クエリーを実行できず"); $this->rows=mysql_num_rows($this->result); $this->if($rows == 0 ){ print ("該当するデータがなし"); }else{ } エラー内容 Parse error: syntax error, unexpected '{' in C:\xampp\htdocs\y\baseClass.php on line 56 56行目とは、$this->if($rows == 0 ){ の部分です

    • ベストアンサー
    • PHP
  • 異なるデータベース間のリレーション

    phpmyadmin上の異なるデータベース間のテーブルでリレーションをかけたいのですが、うまくいきません。 new_linkフラグをtrueにすることで異なるデータベースを開くところまではできました。 アドバイスいただけないでしょうか。 ※DB1の中にtable1が、DB2の中にtable2がある //失敗する $con1 = mysql_connect("localhost",username,pass); mysql_select_db('DB1',$con1); $con2 = mysql_connect("localhost",username,pass,true); mysql_select_db('DB2',$con2); $sql = "select * from table1,table2 where table1.id = table2.id"; $result = mysql_query($sql) or die(mysql_error()); メッセージ⇒Table 'DB2.table1' doesn't exist //これは成功する $con1 = mysql_connect("localhost",username,pass); mysql_select_db('DB1',$con1); $con2 = mysql_connect("localhost",username,pass,true); mysql_select_db('DB2',$con2); $sql1 = "select * from table1"; $result1 = mysql_query($sql,$con1) or die(mysql_error()); $sql2 = "select * from table2"; $result2 = mysql_query($sql2,$con2) or die(mysql_error());

    • ベストアンサー
    • MySQL
  • エラーが出ます。myswl

    <?php $_POST['form']; $db_server = "mysql84.heteml.jp"; $db_username = "******"; $db_password = "******"; $mysql = mysql_connect($db_server, $db_username, $db_password); if ($mysql) { $table_name= "kensaku"; $mysql= ""; mysql_select_db($table_name, $mysql); mysql_set_charset("ECU"); $sql = "SELECT kai, tiiki, syoku, kei FROM kensaku" . "WHERE tiiki = '" . mysql_real_escape_string($tiiki) . "'"; $result = mysql_query($sql); if ($result) { $data_count = mysql_num_rows($result); for($i = 0; $i < $data_count; $i++) { $row = mysql_fetch_row($result); $j = 0; $data[$i]['kai'] = $row[$j++]; $data[$i]['tiiki'] = $row[$j++]; $data[$i]['syoku'] = $row[$j++]; $data[$i]['koyou'] = $row[$j++]; } mysql_free_result($result); } else { $error['top'] = "データベースのエラーです。" . mysql_error(); } mysql_close($mysql); } if (isset($error)) { echo $error['top']; } else { for($i = 0; $i < $data_count; $i++) { echo $data[$i]['kai'] . "|" . $data[$i]['tiiki'] . "|" . $data[$i]['syoku'] . "|" . $data[$i]['koyou'] . "<br />"; } } ?> 書き忘れとかあればおしえてください。

    • 締切済み
    • PHP
  • データベースから多次元連想配列でデータを取得できない

    PHP,MySQLともに初心者です いろんなサンプルプログラムを見て少しずつ進めているのですが、本3冊にネットで検索しても解決できないので・・・ function getSelect($field,$table,$where){ $query="select $field from $table $where;"; $result=$this->getResult($query); return $result; } $result=$db->getSelect("*","main","where myouji=$_POST[myouji]"); while($row = mysql_fetch_array($result[result])){ echo "$row[id]"; } こんな感じでmainテーブルからmyoujiに該当するrowを取得したのですが、 Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in とエラーが出てしまいます。 他のところで、 $result=$db->getSelect("*","main","where id=$_POST[id]"); $rows=mysql_fetch_array($result[result]); としたときはエラーなく行くのですが、上のような多次元連想配列(下の方はidを重複させてないので必ずrowが1つ・・・1次元連想配列?)になるとエラーになってしまいます。 これはどう修正すればいいのでしょうか。 たったこれ1行のつまづきで4時間くらいかかってます。 誰か助けてください

    • ベストアンサー
    • PHP
  • MAX値が取得できない

    次のような形でMySQLデータベースからデータを取得するように組んでいます mainテーブルのkeyフィールド(INT型)の最大値を取得したいと思っています。 function getResult($query){ $result[result]=mysql_query($query,$this->connect); $result[count]=@mysql_num_rows($result[result]); return $result; } function getSelect($field,$table,$where){ $query="select $field from $table $where;"; $result=$this->getResult($query); return $result; } これが別ファイルにあり、もちろん先に読み込ませ、データベースには接続した状態で、 $results=$db->getSelect("max(key)","main",""); $rows=mysql_fetch_array($results[result]); を実行したのですが、 mysql_fetch_array(): supplied argument is not a valid MySQL のエラーとなり、 'max(key)'とすると 最大値が取得できずそのままmax(key)という文字列が返るだけ max'(key)'とすると mysql_fetch_array(): supplied argument is not a valid MySQL のエラーがでます。 MAXなど大文字に変えても同じ結果です。 maxやavgは今回初めて使ってうまくいかないのですが、今までこの構文で通常のselect * fromとかorder by、limitなど他のものは何の問題もなく動きます。 どこをどうかえてやればMAXを取得できるでしょうか。

    • ベストアンサー
    • PHP
  • 以下エラーの修正方法についてCall to undefined function domxml_new_doc() in

    PHPを全く扱ったことのない初心者です。 技術者向けカテゴリーに投稿してしまい、誠に恐縮ですが、 エラーの対処方法について私の知識では到底及びませんので どなたかご教授頂けますでしょうか。 以下phpをブラウザでみると、Call to undefined function domxml_new_doc() in とのエラーがでてしまいます。 修正方法を教えて頂けますでしょうか。 どうかよろしくお願い致します。 <?php require("sql-info.php"); $doc = domxml_new_doc("1.0"); $node = $doc->create_element("MLB"); $parnode = $doc->append_child($node); $connection=mysql_connect ($hostname, $username, $password); if (!$connection) { die('Not connected : ' . mysql_error()); } $db_selected = mysql_select_db($database, $connection); if (!$db_selected) { die ('Can\'t use db : ' . mysql_error()); } $query = "SELECT * FROM MLB WHERE 1"; $result = mysql_query($query); if (!$result) { die('Invalid query: ' . mysql_error()); } header("Content-type: text/xml"); while ($row = @mysql_fetch_assoc($result)){ $node = $doc->create_element("marker"); $newnode = $parnode->append_child($node); $newnode->set_attribute("stadium", $row['stadium']); $newnode->set_attribute("lat", $row['lat']); $newnode->set_attribute("lng", $row['lng']); $xmlfile = $doc->dump_mem(); echo $xmlfile; ?>

    • ベストアンサー
    • PHP
  • MySQLのエラー出力

    MySQLで、テーブルのnumberフィールドのレコードでidフィールドのレコードとpwフィールドのレコードを取り出すことをしています。 $sql = mysql_connect('mysql.example.com', 'user', 'pass'); mysql_select_db('exampledb'); $result = mysql_query("SELECT * FROM `memberlist` WHERE `number` = '{$number}'"); while ($row = mysql_fetch_object($result)){ echo "ID:{$row->id}"; echo "PW:{$row->pw}"; } +------+------+------+ |number|id----|pw----| +------+------+------+ |000001|userid|userpw| +------+------+------+ この場合、$numberに000001を代入することで object(stdClass)#1 (3) { ["number"]=> string(6) "000001" ["id"]=> string(6) "userid" ["pw"]=> string(6) "userpw" } となりますが、 これが、もし$numberにnumberフィールドのレコードに無い値が代入された場合、どうやってエラーを出せばいいのですか?

    • ベストアンサー
    • PHP
  • LIkEで漢字一文字検索でエラー

    お世話になります。 現在、PHPで作成し運営しているサイトでキーワード検索を設置しているのですが、「野」や「三」など漢字一文字で検索すると You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND ××× = AND ○○○ =' at line 3 というエラーになってしまいます。 別の漢字でエラーにならない場合もありますが、多くの漢字でエラーになってしまい、ググってみたものの対処法がわからず困っています。記述は下記の通りです。 $key = addslashes($_POST["keyword"]); $db= new mysqli($host, $username, $password, $database); if(mysqli_connect_errno())  die("Can't connect database : " . mysqli_connect_errno()); if(!$db->query("SET NAMES 'utf8'"))  die(mysqli_error($db)); $query = <<< EOS SELECT * FROM {table} WHERE name LIKE '%{$key}%' AND kana LIKE '%{$key}%' EOS; if(!$result = $db->query($query)) die(mysqli_error($db)); 色々と検証し、kanaのフィールドは問題なくnameのフィールドで エラーが発生しているということが分かりました。また「LIKE '%{$key}'」は問題なく「LIKE '%{$key}'」の前方一致でエラーが起きているみたいです。 ちなみにREGEXPでも試してみたのですがダメみたいです。 対処法をご存知の方がいましたら、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 検索結果の分割表示時のSQLエラー

    PHP, MySQLで検索システムを作り、検索結果の分割表示をしようとしています。 その際、SQL文にエラーが生じるのですが、原因が調べてみてもわかりません。 検索条件のSQL文内のNUM_SHOPSという部分を数値に変えると1ページ目はきちんと分割表示されますが2ページ目以降が全件表示されてしまいます。 そして、NUM_SHOPSの部分をそのままにすると、SQLがエラーを起こします。var_dumpで$queryを確認すると、SQL文が二重に入ってしまっているのですが、どうしてこのような現象が起きるのかがいまいちわかりません。 アドバイス、ご指摘等いただけないでしょうか。 よろしくお願い致します。 以下に該当箇所のコードを記載します。 【result.php】 <?php require_once('config.php'); require_once('functions.php'); connectDb(); if (preg_match('/^[1-9][0-9]*$/', $_GET['page'])) { $page = (int)$_GET['page']; } else { $page = 1; } $offset = NUM_SHOPS * ($page - 1); //クエリ生成 $query = "SELECT * FROM テーブル名"; //検索条件抽出 $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC '; } if (count($where) <> 0) { $query .= "limit " . $offset . ", NUM_SHOPS" ; } var_dump($query); //Result $result = mysql_query($query) or die($query . '<br />' . mysql_error() . '<hr />'); //検索結果件数カウント $query = "SELECT COUNT(id) FROM テーブル名"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC'; } $total = mysql_result(mysql_query($query), 0); $from = $offset + 1; $to = ($offset + NUM_SHOPS) < $total ? ($offset + NUM_SHOPS) : $total; ?> 【config.php】 <?php define('DB_HOST', '*************'); define('DB_USER', '*************'); define('DB_PASSWORD', '*************'); define('DB_NAME', '*************'); //ページごとのショップ数 define('NUM_SHOPS', 10); //エラー表示 error_reporting(E_ALL & ~E_NOTICE); 【functions.php】 <?php function connectDb() { mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die("can not connect to DB:".mysql_error()); mysql_select_db(DB_NAME) or die("can not select DB: ".mysql_error()); } function h($s) { return htmlspecialchars($s); }

    • ベストアンサー
    • PHP
  • PHPを使ってMySQLのフィールドの追加ができない

    function部分は外部ファイル function getResult($query){ $result[result]=mysql_query($query,$this->connect) or die(mysql_error()); $result[count]=@mysql_num_rows($result[result]); return $result; } $null = ""; $query="insert into main values ($_POST[id],'$_POST[name]',$null,$null,$null,'$null')"; $insert[result]=$db->getResult($query); このように記述してmainテーブル内に新規フィールドの追加をしようとしたのですが、次のようなエラーが出ます。 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',,'')' at line 1 $nullは結局NULL値なので、 ($_POST[id],'$_POST[name]',,,,) でやってみたのですが、これも同じです。 当たり前といえば当たり前ですが、 ($_POST[id],'$_POST[name]',,,,)を ($_POST[id],'$_POST[name]')と 省略してみましたが、数が合わないとエラーが返ってきました。 定型のfunctionに頼らず、$insert[result]=$db->getResult($query);のかわりに if(mysql_query($query,$db->connect)){ echo"成功"; }else{ echo"失敗"; } このようにも試してみたのですが、データは追加されず、失敗と表示されてしまいます。 どこをどう修正すればいいでしょうか。 どなたかお助けください。 ちなみに1,3~5番目が数値型で、2,6番目が文字型、1番目以外はNULLを許可しています。 どこもオートインクリメントは使用していません。

    • ベストアンサー
    • PHP