質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1977閲覧

prepareとquery

gyojin

総合スコア94

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/11/19 07:49

編集2015/11/19 14:51

単純な質問になります
(以下は$mysqli=new mysqliでデータベースは接続済みで読んでください)

php

1$searchName="470138f050bdd85431e0704dbe11a94d3"; 2//query版 3$string="SELECT * FROM ".$table." WHERE hashName = '".$searchName."' "; 4if( !($result=$mysqli->query($string)) ){ 5 $this->error="query error"; 6return false; 7 }

こちらは通るのに

php

1$searchName="470138f050bdd85431e0704dbe11a94d3"; 2//prepare版 3$string="SELECT * FROM ".$table." WHERE hashName = ? "; 4if( !($result=$mysqli->prepare($string)) ){ 5 $this->error="prepare error"; 6return false; 7} 8$result->bind_param("s",$searchName); 9if( !($result->execute()) ){ 10 $this->error="execute error:"; 11return false; 12}

こちらは結果が出ませんでした(エラーではなく、結果が0行でした)
なにがまずかったのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

http://php.net/manual/ja/mysqli.query.php
こちらはquery版ですが、必要な手順を全て満たしているように見えますね。

http://php.net/manual/ja/mysqli.prepare.php
見た感じこの手順が足りない気がしますが、
質問文のコードのさらに下に書いてありますか?

PHP

1/* 結果変数をバインドします */ 2 $stmt->bind_result($district); 3 4/* 値を取得します */ 5 $stmt->fetch();

投稿2015/11/19 12:09

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyojin

2015/11/19 16:07

付けていませんでした。 そこで気が付きましたがPDOと違い 値を取得する(値が返ってくる)場合はmysqliではfetch_arrayやfetch_assocの前にget_result()関数をかけて値を得るか ご指摘のようにbind_resultとfetchで値を取得する作業が必要になるのですね。 最終的に以下のようにしてfatch_arrayでmysqli_queryと同様に値をfetch_arrayで取れるようになりました //prepare版 $string="SELECT * FROM ".$table." WHERE hashName=?"; if( !($result=$this->mysqli->prepare($string)) ){ $this->error="prepare error"; $mysqli->close(); $result->close(); return false; } $result->bind_param("s",$searchName); if( !($result->execute()) ){ $this->error="execute error:"; $mysqli->close(); $result->close(); return false; } if( !($finalA=$result->get_result()) ){ $this->error="get_result error"; $mysqli->close(); $result->close(); return false; } if( $finalA->num_rows==0 ){ $this->error="no result error"; $this->mysqli->close(); $result->close(); return false; } $this->mysqli->close(); $result->close(); return $finalA; どうもお付き合いいただきありがとうございました。
KiyoshiMotoki

2015/11/19 16:16

なるほど、そういうことだったのですね。。 改めてリファレンスを見ると確かに、 mysqli::query と mysqli_stmt::execute とでは戻り値の型が異なりますね。 gyojin様、miyabi-sun様、ありがとうございます。 勉強させていただきました。
gyojin

2015/11/19 16:25 編集

こちらこそありがとうございます いい勉強になりました。 家の環境ではget_result()関数がデフォでは使えない状態になっていましたので返答までに ひと手間かかってしまいました(windowsでは問題ない?ようです)
guest

0

mysqli_error_list
mysqli_error

上記のようなデバッグコードを使いましょう。

投稿2015/11/19 15:31

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

推測ですが、以下ではいかがでしょうか?

php

1//prepare版 2$string="SELECT * FROM ".$this->table." WHERE hashName = ? ;"; 3if( !($result=$this->mysqli->prepare($string)) ){ 4 $this->error="prepare error"; 5return false; 6} 7 8$result->bind_param("s",$searchName); 9$searchName="470138f050bdd85431e0704dbe11a94d3"; // ここで値をセットする 10 11if( !($result->execute()) ){ 12 $this->error="SELECT execute error:".$string; 13return false; 14}

公式のリファレンスにあるサンプルコードを見ると、
bind_paramを呼び出した後に、変数に値をセットしていましたので。
http://php.net/manual/ja/mysqli-stmt.bind-param.php

投稿2015/11/19 07:57

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2015/11/19 13:50

gyojin様、返信ありがとうございます。 紹介いただいたprepareメソッドのリファレンスを見て思いついたのですが、 SQL文の末尾のセミコロン(";")を削除して、試してみてもらえますか? 上記リファレンスに > 注意: > ステートメントの最後にセミコロンや \g を追加してはいけません。 という記載がありましたので、もしかしたらこれが影響しているのかもしれません。
gyojin

2015/11/19 14:50

返信ありがとうございます。 残念ながら変化はありませんでした。 質問文の方もセミコロンを外しておきますね
KiyoshiMotoki

2015/11/19 15:26

変化ありませんでしたか。。 お力になれず申し訳ありませんが、 今のところ、私には他に思いつくことがありません。 何かわかりましたら、またこちらでご連絡させていただきますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問