クエリ検索でのWHERE句HAVING句併用

このQ&Aのポイント
  • クエリ検索でのWHERE句HAVING句併用がうまくいかない原因を教えてください。
  • 元ソースコードに「WHERE category = '%s'」を追加しましたが、エラーメッセージが表示されます。
  • プログラム途中での変数の値を表示する方法についても教えてください。
回答を見る
  • ベストアンサー

クエリ検索でのWHERE句 HAVING句併用

(1)元ソースコードに「WHERE category = '%s'」を追加しましたが、クエリ検索でのWHERE句 HAVING句の併用がうまくいきません。 firefoxの要素調査では、ソース改造前には出なかった「HTML ドキュメントの文字エンコーディングが宣言されていません。」のエラーメッセージが出ます。(phpのソースなのにHTMLのエラー?) 原因が分かりましたらお教え願いたく宜しくお願い致します。 元ソースコードに「WHERE category = '%s'」を追加した状態。 // Search the rows in the markers table $query = sprintf("SELECT address, name, lat, lng, category, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers WHERE category = '%s' GROUP BY distance HAVING distance < '%s' ORDER BY distance LIMIT 0 , 200", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($category)), mysql_real_escape_string($radius)); $result = mysql_query($query); ※ ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) ・・・は入力された住所の緯度経度($center_lat $center_lng)から店(複数任意登録)までの距離を計算する公式 <質問の背景> https://developers.google.com/maps/articles/phpsqlsearch_v3?hl=ja#createmap でselect要素にcategory(店の種類:小売店・食事など)を追加しようと思っています。 上記質問は上記サイトでの「phpsqlsearch_genxml.php」の$query の部分です。 なお、「phpsqlsearch_genxml.php」のソースは下記のとおりです。 <?php require("phpsqlsearch_dbinfo.php"); // Get parameters from URL $center_lat = $_GET["lat"]; $center_lng = $_GET["lng"]; $radius = $_GET["radius"]; // Start XML file, create parent node $dom = new DOMDocument("1.0"); $node = $dom->createElement("markers"); $parnode = $dom->appendChild($node); // Opens a connection to a mySQL server $connection=mysql_connect (localhost, $username, $password); if (!$connection) { die("Not connected : " . mysql_error()); } // Set the active mySQL database $db_selected = mysql_select_db($database, $connection); if (!$db_selected) { die ("Can\'t use db : " . mysql_error()); } // Search the rows in the markers table $query = sprintf("SELECT address, name, lat, lng, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($radius)); $result = mysql_query($query); if (!$result) { die("Invalid query: " . mysql_error()); } header("Content-type: text/xml"); // Iterate through the rows, adding XML nodes for each while ($row = @mysql_fetch_assoc($result)){ $node = $dom->createElement("marker"); $newnode = $parnode->appendChild($node); $newnode->setAttribute("name", $row['name']); $newnode->setAttribute("address", $row['address']); $newnode->setAttribute("lat", $row['lat']); $newnode->setAttribute("lng", $row['lng']); $newnode->setAttribute("distance", $row['distance']); } echo $dom->saveXML(); ?> (2)上記のエラー原因探すために、都度、プログラム途中での変数の値を表示できれば(javascriptの変数var  PHPの変数$の値など)と思いますが、何か方法はあるものでしょうか。 (phpのflushなどがあるみたいですがHTML全体のどこにどのように記述すればいいのでしょうか。 もしできるなら、私の提示した具体的な上記ソースを例にとっていただければ助かります。)

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

>「distance < '%s'」と「WHERE category = '%s'」両方を記載する 実際に試しながらやってるわけではないので、記述ミスがあったらあしからず。 考え方としては、categoryはサブクエリの中で絞り込んで、distanceは外側で絞り込めばいいのでは? $query = sprintf("SELECT * FROM (SELECT address, name, lat, lng, category, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers WHERE category = '%s') AS sub WHERE distance < '%s' ORDER BY distance LIMIT 0 , 200", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($category), mysql_real_escape_string($radius) );

wai8605
質問者

補足

ご提示ありましたソースを実行しました。合わせてほかのパターンも試してみました。 (1)ご提示ありましたソース⇒エラー $query = sprintf("SELECT * FROM (SELECT address, name, lat, lng, category, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers WHERE category = '%s') AS sub WHERE distance < '%s' ORDER BY distance LIMIT 0 , 200", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($category), mysql_real_escape_string($radius) ); (2)上記からdistanceをはずした⇒OK $query = sprintf("SELECT * FROM(SELECT address, name, lat, lng, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers WHERE category = '%s' ORDER BY distance LIMIT 0 , 200) AS sub ", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), // mysql_real_escape_string($radius), mysql_real_escape_string($category)); (3)ご提示ありましたソースの「WHERE distance」を「HAVING distance」に変更⇒エラー $query = sprintf("SELECT * FROM (SELECT address, name, lat, lng, category, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers WHERE category = '%s') AS sub HAVING distance < '%s' ORDER BY distance LIMIT 0 , 200", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($category), mysql_real_escape_string($radius) ); なかなかしぶといカンジです。 「distance < '%s'」と「WHERE category = '%s'」両方を記載するさらなるヒントをいただければ助かります。 (かれこれ、この問題、1週間くらいになります。ここを突破しないと先に進めないので何年でも粘る所存で、今後、私もあれこれ試していきます。  本日はこれからOSC北海道(https://www.ospn.jp/osc2014-do/)を覗いて、頭を冷やしてきます。)

その他の回答 (5)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.6

>2バイトの漢字の扱いがおかしいのが原因かと思います 渡した文字の文字コードと、DBに格納されている文字の文字コードが 異なるのでしょう。 日本語の取り扱いについては、解説書に必ず書かれていますので 一度きちんと読まれた方がいいでしょう

wai8605
質問者

お礼

アドバイスにありました「渡した文字の文字コードと、DBに格納されている文字の文字コードが異なるのでしょう。」に沿って調べましたら、無事完成致しました。 yambejp先生、お忙しい中、未熟者の私に長らくおつきあい頂きまして、本当にありがとうございました。 yambejp先生なしでは、何年かかったことか・・・。 今後、一層精進して、yambejp先生のように教えれる立場になりたいと思っています。 このたびは本当にありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

ちなみにエラーは「HTML ドキュメントのなんちゃら・・・」のままですか? SQLの文法問題であれば >die("Invalid query: " . mysql_error()); のところでエラー内容が表示されると思います またPHPのパースエラーなどであれば error_reporting(E_ALL); など、ソースのあたまの方にいれておけばそれなりのエラーが表示されると思います。 上記2点がとおっているなら DOMDocumentの方の問題かもしれませんね

wai8605
質問者

補足

前回ご提示いただきましたソースに問題ありませんでした。 私の使ったデータではクエリーの結果が0件だったため、おかしな表示になっただけでした。 下記の様な定数を決め打ちで、クエリーを動かしてみたところ正常に動きました。 $center_lat = "100"; $center_lng = "20"; $radius = "10000"; $category ="100"; $query = sprintf("SELECT * FROM (SELECT address, name, lat, lng, category, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers WHERE category = '%s') AS sub WHERE distance < '%s' ORDER BY distance LIMIT 0 , 200", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($category), mysql_real_escape_string($radius) ); ところが「$category」を2バイトの漢字にしたところ(DBの「category」をTEXT型にし、いくつかの categoryを「食事」に変更)また、クエリーの結果が0件になってしまいました。 2バイトの漢字の扱いがおかしいのが原因かと思いますが、よくわかりません。 何かヒントをいただければ助かります。 $center_lat = "100"; $center_lng = "20"; $radius = "10000"; $category ="食事";

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

クォーテーションの位置も変だし、サブクエリも変 もしかしてサブクエリ自体理解していませんか? 一度マニュアルをよく読まれるとよろしいかと とりあえずこんな感じでしょうか? $query = sprintf("SELECT * FROM (SELECT address, name, lat, lng, category,(・・・) AS distance FROM markers ) AS sub WHERE distance < '%s' ORDER BY distance LIMIT 0 , 200", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($radius));

wai8605
質問者

補足

なるべくご迷惑をお掛けしないように、ネットで調べても判らないことを質問しようと心がけていますが、至らない点が多々あり、ご迷惑おかけしています。 申し訳ございませんが、今一度質問させてください。 (1)yambejpさんの提示していただいたソース⇒OK $query = sprintf("SELECT * FROM(SELECT address, name, lat, lng, category, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers) AS sub WHERE distance < '%s' ORDER BY distance LIMIT 0 , 200", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($radius)); (2)yambejpさんの提示していただいたソースの「distance < '%s'」を「WHERE category = '%s'」に変更⇒OK $query = sprintf("SELECT * FROM(SELECT address, name, lat, lng, category, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers) AS sub WHERE category = '%s' ORDER BY distance LIMIT 0 , 200", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($category)); (3)yambejpさんの提示していただいたソースに「distance < '%s'」と「WHERE category = '%s'」両方を記載⇒エラー $query = sprintf("SELECT * FROM(SELECT address, name, lat, lng, category, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers) AS sub WHERE category = '%s' AND category = '%s' ORDER BY distance LIMIT 0 , 200", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($radius), mysql_real_escape_string($category)); yambejpさんの提示していただいたソースに「distance < '%s'」と「WHERE category = '%s'」両方を記載するアドバイスをいただければ助かります。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

仮にこんなデータで検証してみると CREATE TABLE tbl(x int,y int); INSERT INTO tbl values(2,3),(1,-6),(0,0),(-3,4); (1)SELECT句で付けた別名をつかってWHERE句で絞り込みはできません SELECT (x + y) as hoge FROM tbl WHERE hoge>0; 的なことは無理だということ (2)HAVINGはSELECTの別名を利用できますが、本来GROUP BYとの組み合わせで しかつかえない句なので SELECT (x + y) as hoge FROM tbl HAVING hoge>0; という書き方はお勧めできません ※ただしMySQLでは参照できてしまいます (3)ただしい書き方 SELECT (x + y) as hoge FROM tbl WHERE (x + y)>0; しかし、同じ式を2度書くのも非効率なので結局サブクエリをつかって SELECT hoge FROM (SELECT (x + y) as hoge FROM tbl) as sub WHERE hoge>0; とするのが妥当です。

wai8605
質問者

補足

categoryでの検索条件を追加する前に、元のコードのSELECT結果をFROM句に設定して稼働するか試してみましたが、正常に稼働しませんでした。 何かアドバイスいただければ助かります。 (1)元のコード⇒正常にMAP表示される $query = sprintf("SELECT address, name, lat, lng, category, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < '%s' ORDER BY distance LIMIT 0 , 200", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($radius)); (2)元のコードをインラインビュー風にFROMの後に配置⇒正常にMAP表示されない $query = sprintf(SELECT * FROM ("SELECT address, name, lat, lng, category, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < '%s' ORDER BY distance LIMIT 0 , 200", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($radius))); (3)上記のコードの最初の「SELECT」を「”SELECT」に変更し、閉じる「”」を最後の「($radius))");」の箇所に付加⇒正常にMAP表示されない ※「”」の扱いが誤っているのか? $query = sprintf("SELECT * FROM ("SELECT address, name, lat, lng, category, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < '%s' ORDER BY distance LIMIT 0 , 200", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($radius))");

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

これはtypo? $query = sprintf("SELECT ・・・", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($category)), mysql_real_escape_string($radius)); 4番目の引数指定時にカッコ閉じが2回入っているので このままいくとおそらくシンタックスエラー・・・

wai8605
質問者

補足

yambejpさん、ご回答ありがとうございます。 4番目の引数指定時にカッコ閉じを訂正しました。 (1)元のコード ・・・・FROM markers HAVING distance < '%s' ORDER BY distance LIMIT 0 , 200", だと、OK (2)変更 ・・・・FROM markers WHERE distance < '%s' ORDER BY distance LIMIT 0 , 200", だと、エラー。 (3)category使用 ・・・・FROM markers HAVING category = '%s' ORDER BY distance LIMIT 0 , 200", ・・・・FROM markers WHERE category = '%s' ORDER BY distance LIMIT 0 , 200", だと、OK 上記を考えると、distanceは集計関数の条件に見えます。 それで2つを組み合わせて ・・・・FROM markers WHERE category = '%s' HAVING distance < '%s' ORDER BY distance LIMIT 0 , 200", だと、エラー。 ・・・・FROM markers WHERE category = '%s' GROUP BY distance HAVING distance < '%s' ORDER BY distance LIMIT 0 , 200", も、エラー。 category と distanceの組み合わせの仕方が分かりません。 何かアドバイスいただけますでしょうか。

関連するQ&A

  • sprintf関数での%Sが分かりません。

    質問の背景は下記でのsprintf関数での%Sについてです。 https://developers.google.com/maps/articles/phpsqlsearch_v3?hl=ja#createmap 上記での流れは、添付画像のように、 ・住所を入力することで 緯度経度が算出され、(center.lat() center.lng()) ・また、半径('radiusSelect)が選択(この場合は20Km)されることで、 ・選択住所(center.lat() center.lng())から選択半径内の登録店舗がgooglemapに表示される。 というものです。 (1)<「phpsqlsearch_genxml.php」に選択値を渡す。>(62行目) var radius = document.getElementById('radiusSelect').value; var searchUrl = 'phpsqlsearch_genxml.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius; (※ 例えばcenter.lat()を緯度37 center.lng()を経度-122とします) (2)<「phpsqlsearch_genxml.php」において、該当する店舗を見つけ出す。> // Get parameters from URL $center_lat = $_GET["lat"]; $center_lng = $_GET["lng"]; $radius = $_GET["radius"];    ・・・・・・ // Search the rows in the markers table $query = sprintf("SELECT address, name, lat, lng, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < '%s' ORDER BY distance LIMIT 0 , 200", mysql_real_escape_string($center_lat), mysql_real_escape_string($center_lng), mysql_real_escape_string($center_lat), mysql_real_escape_string($radius)); $result = mysql_query($query); (※ ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat )は中心地からの半径を求める公式) 上記(2)で書式指定(string)の%Sが使用されていますが、そこには下記数値文字が入ります。 SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 20 同じ%Sに対してそれぞれ、37・-122・20の異なった数値文字が対応される仕組みが分かりません。 ご教示お願いいたします。

  • PHPのPDOについて

    例えば手続き型でしたら、値をデータベースに追加するとき $sql = sprintf( 'INSERT INTO member SET id=%d, message="%s" ', mysql_real_escape_string($id), mysql_real_escape_string($message) ); mysql_query($sql) or die(mysql_error()); など「mysql_real_escape_string」を使って多少なりともセキュリティーをかけると思うのですが、PDOですと下記に書かれている以外に見たことないのですが、「mysql_real_escape_string」などはやらなくても大丈夫ということなのでしょうか? PDOの場合 $sql = 'INSERT INTO member SET id=?, message=?'; $stmt = $db->prepare($sql); $stmt->execute(array($id, $message)); 色々調べてみたのですがいまいち分からないためよろしくお願いします。

    • ベストアンサー
    • PHP
  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • 複数の条件の検索

    会員の名前の更新するときに、会員以外の重複がないか調べたいです 会員以外のidと名前の一致を取得しようとしましたがうまくうごきません やりたいことは 会員以外の名前と入力した名前が重複してないか調べたいです $id = mysql_real_escape_string($_POST['id]); $name = mysql_real_escape_string($_POST['name']); $name3 = mysql_query("SELECT name FROM hoge2 WHERE NOT id='.$id.' AND name='".$name."'");

    • ベストアンサー
    • MySQL
  • GoogleMapsAPIについて

    いろいろと調査をして、試みたのですがうまくいかないため質問させていただきます。 今回、MySQLの位置情報のデータをPHPに渡し、XMLファイルを生成し、GoogleMap上にマーカーを作成しようと考えています。 そこで以下のURLを参考に作成してみたのですが、GoogleMap上にマーカーが表示されません。 http://developers.google.com/maps/articles/phpsqlajax_v3?hl=ja XMLファイルを読み込んでGoogleMap上にマーカーを表示させることができたのですが、phpファイルですとどうもうまくいきません。 アドバイスをいただければ幸いです。 [map.html] <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>Google Maps AJAX + mySQL/PHP Example</title> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>   <script type="text/javascript"> function load() { var map = new google.maps.Map(document.getElementById("map"), { center: new google.maps.LatLng(47.6145, -122.3418), zoom: 13, mapTypeId:google.maps.MapTypeId.ROADMAP }); var infoWindow = new google.maps.InfoWindow; downloadUrl("phpsqlajax_genxml.php", function(data) { var xml = parseXml(data); var markers = xml.documentElement.getElementsByTagName("marker"); for (var i = 0; i < markers.length; i++) { var name = markers[i].getAttribute("name"); var address = markers[i].getAttribute("address"); var type = markers[i].getAttribute("type"); var point = new google.maps.LatLng( parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng"))); var html = "<b>" + name + "</b> <br/>" + address; var marker = new google.maps.Marker({ map: map, position: point, }); bindInfoWindow(marker, map, infoWindow, html); } }); } function bindInfoWindow(marker, map, infoWindow, html) { google.maps.event.addListener(marker, 'click', function() { infoWindow.setContent(html); infoWindow.open(map, marker); }); } function downloadUrl(url,callback){ var request=window.ActiveXObject? new ActiveXObject('Microsoft.XMLHTTP'): new XMLHttpRequest; request.onreadystatechange=function(){ if(request.readyState==4){ request.onreadystatechange=doNothing; callback(request.responseText,request.status); } }; request.open('GET',url,true); request.send(null); } function parseXml(str){ if(window.ActiveXObject){ var doc=new ActiveXObject('Msxml2.DOMDocument.3.0'); doc.loadXML(str); return doc; }else if(window.DOMParser){ return(new DOMParser).parseFromString(str,'text/xml'); } } function doNothing(){} </script> </head> <body onload="load()"> <div id="map" style="width: 600px; height: 600px"></div> </body> </html> [phpsqlajax_genxml.php] <?php require("sql-info.php"); //スタートXMLファイル、親ノード作成 $dom = new DOMDocument("1.0"); $node = $dom -> createElement("markers"); $parnode = $dom -> appendChild($node); //MySQLサーバへの接続 $connection = mysql_connect('localhost',$username,$password); if(!$connection){ die('Not connected :' . mysql_error()); } //MySQLデータサーバのセット $db_selected=mysql_select_db($database,$connection); if(!$db_selected){ die ('Can\'t use db : ' . mysql_error()); } // テーブルデータの全行列を選択 $query = "SELECT * FROM markers WHERE 1"; $result = mysql_query($query); if (!$result) { die('Invalid query: '. mysql_error()); } header("Content-Type:text/xml; charset=utf-8"); // 各XMLノードへのデータ追加を繰り返す while ($row = @mysql_fetch_assoc($result)){ //XMLドキュメントノードに追加する $node = $dom->createElement("marker"); $newnode = $parnode->appendchild($node); $newnode->setattribute("name", $row['name']); $newnode->setattribute("address", $row['address']); $newnode->setattribute("lat", $row['lat']); $newnode->setattribute("lng", $row['lng']); $newnode->setattribute("type", $row['type']); } echo $dom->saveXML(); ?>

  • mysql_real_escape_string

    独学数ヶ月の初心者の質問で恐縮です。 もろもろの事情で仕方なくmysql_real_escape_stringを 以下(1)のように使用しなくてはならないと仮定し、 セキュリテイの面で(2)のようにシングルクオテーションつける 事で危険を回避できますか? またシングルクオテーションは(2)のようにつけてはいけない とかありますか?(記述の基本が曖昧なため、ただの確認の質問) (1) $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id", mysql_real_escape_string($id), mysql_real_escape_string($password)); (2) $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id", ’mysql_real_escape_string($id)’, ’mysql_real_escape_string($password)’); よろしくお願いします。

    • ベストアンサー
    • MySQL
  • mysqlのinsert文について、ご指導をお願いいたします。

    はじめまして。 プログラミング初心者です。 現在、PHP&MySQLで会員制掲示板を制作しようと奮闘しております。 会員登録フォームを作成し、下記SQL文にて会員登録を行おうとしているのですが、「エラーは出ていないのに、DBにデータが登録されない。」状況で、なにがおかしいのかわからず非常に困っております。尚、DBには正常に接続されています。 環境はVISTAにXAMPPを入れております。 私、PHP初心者のため、本のサンプルソースを加工して使用しようとしています。 下記にソースを記載いたしますので、 どうかご指導のほどお願いいたします。 (※情報が不足しておりましたら申し訳ありません。必要な情報をお教えいただけましたら幸いです。) // 接続 $link = mysql_connect( $db_host, $db_user, $db_password ); mysql_select_db( $db_name ); $result = mysql_query( 'set character set utf8' ); $sql = "select email1 from users where email = '" . mysql_real_escape_string( $_POST['email'] ) . "'"; $result = mysql_query( $sql ); // if ( $error != '' ) exit; // 会員データの挿入 $sql = "insert into member ( login_id, passwd, register_date, nickname, sex, birthday, email, pref, division, state ) values ( '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . md5( $_POST['passwd'] ) . "', '" . date( 'Y-m-d H:i:s' ) . "', '" . mysql_real_escape_string( $_POST['nickname'] ) . "', '" . mysql_real_escape_string( $_POST['sex'] ) . "', '" . mysql_real_escape_string( $_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'] . ' 00:00:00' ) . "', '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . mysql_real_escape_string( $_POST['pref'] ) . "', '" . mysql_real_escape_string( $_POST['division'] ) . "', '1' )"; $result = mysql_query( $sql ); //echo $sql; // $title = '会員登録[3/4]'; ?>

    • ベストアンサー
    • PHP
  • mysql_real_escape_string?

    mysql_real_escape_stringは、非推奨なのでしょうか? ▽PHP: mysql_real_escape_string - Manual   http://php.net/manual/ja/function.mysql-real-escape-string.php >この拡張モジュールを使うことはおすすめできません。 MySQLi あるいは PDO_MySQL を使うべきです この「拡張モジュール」って何を意味しているのでしょうか? 「mysql_real_escape_string」のことでしょうか? それとも、mysql_set_charset()などで、「デフォルトの文字セット」を設定しておけば、利用しても良いのでしょうか?

    • ベストアンサー
    • PHP
  • mysql_real_escape_string

    mysql_real_escape_stringについて調べていると、私と同じことを疑問に思い質問している人がいました。 こちらのページです。 http://okwave.jp/qa/q4423735.html mysql_real_escape_stringを通してDBに入れるとします。 すると、「テスト\」というデータをINSERTをするとDBには「テスト\」で入るのでしょうか? では、mysql_real_escape_stringを通さずにdbに入れても 「テスト\」というデータをINSERTをするとDBには「テスト\」で入ると思います。 上記のとおりとした場合、PHPはどうやってmysql_real_escape_stringを通したかどうか判定しているのでしょうか? 現在、mysql_real_escape_stringを通してDBに入れると、 「テスト\\」というデータがDBに入っています。 それをどうやって戻すのか調べていて、上記の質問を見つけました。 どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • html用とmysql用のエスケープ処理の両立方法

    一度htmlspecialcharsしたものをmysql_real_escape_stringしてはいけない、そうです。 下記のように$pageをブラウザに表示もして、mysqlでも使う場合はどうするのでしょうか。 先にmysql_real_escape_stringを使い終わった後に、 htmlspecialcharsを使うような構造になるように工夫するのでしょうか。 htmlspecialcharsは出力する直前に使用しなければならないですが、 mysql_real_escape_stringは直前でなくても構わないとのことなので そこも意識して・・・ $mysql = mysql_connect($HostName,$UserName,$Password); $page = mysql_real_escape_string($_GET['page']); $mysql_c = "SELECT * FROM tttttt WHERE page='$page'"; $mysql_q = mysql_query($mysql_c,$mysql); $page = htmlspecialchars($_GET['page']); $html = '<a href="?page='.$page.'">'.$page.'</a>'; <html> <body> <div><?php echo $page; ?></div> 他には方法がないのでしょうか。

    • ベストアンサー
    • PHP