- ベストアンサー
PHPとMySQLとの連携エラーの解決方法とは?
- PHPとMySQLとの連携でエラーが発生しました。エラーメッセージ「Warning: mysqli_select_db() expects parameter 1 to be mysqli, string given」が表示され、データベースの選択に失敗しています。
- 問題の原因は、11行目のコードでmysqli_select_db()関数に渡すパラメータが間違っています。正しくはmysqliオブジェクトを指定する必要があります。
- ネットでの情報検索でも、このエラーメッセージに関する具体的な解決策は得られませんでした。適切なmysqliオブジェクトを指定することで解決できる可能性があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
そろそろ元の質問からだいぶ離れてきているような気がします。 まだまだ疑問がおありであれば、別の質問を立てることをお勧めします。 私も盆休みが終わるので、今後は回答が難しくなりますし。 > 提示して頂いたサンプルコードを元に自分のDBのパスワードを入れ、 > phpファイルを作り実行しましたが (中略) これで問題ないんでしょうか? 正しく動いてないでしょう。 サンプルを自分の環境で動くように直して使われようとされているのでしょうが、 直し方が間違っているのかと思います。少なくとも以下のコードは修正の要否を 検討する必要があるかと。 $conn=mysqli_connect('localhost','root','*******') ⇒ パスワードは修正されたようですが、その他の接続情報は合っていますか? mysqli_select_db($conn,'userid_db') ⇒ 接続先のDB名は合っていますか? $sql="SELECT * FROM userid_tbl;" ⇒ 接続するテーブル名は合っていますか? <td><?= $userid['id'] ?></td><td><?= $userid['userName'] ?></td><td><?= $userid['passWd'] ?></td> ⇒ 接続するテーブルには Id, userName, PassWd という列があるのですか? 実際に接続するテーブルに存在する列になおさなくてはダメです。 ネット上にあるサンプルは、ステップ・バイ・ステップな初心者向け解説本とは 違って『コピペしてすぐに使えるモノ』ではありません。使いこなすためには サンプルに書かれているコードの内容を理解して、自分の環境に合わせてカスタ マイズする必要があります。 今回紹介したサンプルは解説が詳しく書かれているので、理解しやすいほうですよ。 > 例えば、mysqli_connectとかのページ(http://php.net/manual/ja/mysqli.construct.php) > を見ても、そのままコピーペーストで使えるならいいんですが、 > 応用がきかないので中々使いこなせないです。 先にも書きましたが、サンプルとは「コピペで使えるモノ」ではありません。 例えるなら国語辞典の例文です。国語辞典の例文をコピペしても、小学生の作文 すら書けないでしょう。例文の意味を理解して、応用する能力が必要です。 私が「マニュアルを見てますか?」というのは、マニュアルの『内容』、例えば 関数の機能や、関数の引数、使い方を確認していますか、と言う意味です。内容 をきちんと確認しているのであれば、mysqli_query($sql, $link) などというミスは 質問するまでもなく自力で気づきます。
その他の回答 (4)
(1) > 34行目は <title>全件表示</title> ですが、タイトルタグがおかしい? PHPのエラーの行番号は「PHPコード (<?php ~ ?> の部分など) だけを数えた とき」の行番号です。なので、今回のように HTML を直接書いている場合は 行番号がずれます。行番号は「このあたりらしい」とアタリを付ける程度で 考えたほうが良いです。 > エラーとしてはString型に変換できていないのが原因? 正解です。$link と $result は String に変換できません (キャストできません)。 キャストできないので $result2 = (string) $result; もエラーになります。 ・$link の内容を出力することはそもそもナンセンスです。 $link の中身は『DB接続オブジェクト』で、出力するようなものではありません。 接続ID:<?= $link ?><br /> の1行は消しましょう。 ・$result のほうはそもそも使い方が全く間違っています。 $result の中身は "SELECT * FROM 省略" を実行した結果の「2次元の表」です。 ここから実際のデータを抜き出すためには専用のコードを書かなくてはなりません。 サンプルコードを見て下さい。 http://manabukun.net/kyouzai/php/php14.htm ※ mysql と mysqli の2系統の解説が載っているので混乱しないでくださいね。 今回使用されているのは mysqli ですよ。 (2) > こうするとエラー文が以下の通りでした。 先の回答で紹介したページは『エラーの詳細内容の表示の仕方』を解説している ページです。そこに掲載されているのは「エラーが発生して、詳細内容が表示さ れる」サンプルですので、最初から正常動作しません。混乱させてすいません。 ところで、問題が発生した時に PHP の関数マニュアルはきちんとチェックされて いますか? 今までの質問で引数レベルの誤りも散見されます。闇雲に実行するの ではなく、きちんとマニュアルは読んでください。そうしないと問題を自力で解決 できるようになりません。
補足
提示して頂いたサンプルコードを元に自分のDBのパスワードを入れ、phpファイルを作り実行しましたが、 id userName passWd で始まるテーブルが表示され、中身がNotice: Undefined indexとなってますがこれで問題ないんでしょうか? >問題が発生した時に PHP の関数マニュアルはきちんとチェックされていますか? 例えばこういうページですよね? http://php.net/manual/ja/funcref.php 例えば、mysqli_connectとかのページ(http://php.net/manual/ja/mysqli.construct.php )を見ても、そのままコピーペーストで使えるならいいんですが、 応用がきかないので中々使いこなせないです。
> 今度は以下のエラーが出ました。 mysqli_select_db のエラーは出なくなってしまったようですね。 今出ている mysqli_query のエラーのほうを何とかしますか。 mysqli_query($sql, $link) は引数が逆です。正解は mysqli_query($link, $sql) なお、先の回答で紹介した mysqli_error($link) は『直近のエラーの内容を文字列で返す』という機能です。mysqli_* を呼び出しているエラー処理 (or die ~) では全て呼び出して、エラー詳細を出力するようにすることをお勧めします。 http://www.phpmanual.jp/function.mysqli-error.html
補足
何度も有難うございます。 >mysqli_query($sql, $link) は引数が逆です 順番を変えたところ、今度は以下のエラーが出ました。 34行目は <title>全件表示</title> ですが、タイトルタグがおかしい? 接続ID: Catchable fatal error: Object of class mysqli could not be converted to string in C:\Program Files\Apache\Apache24\htdocs\sample\ファイル名.php on line 34 直訳を考えてみると、エラーとしてはString型に変換できていないのが原因? それで $result2 = (string) $result; $link2 = (string) $link; とかを1つずつ入れてみたんですが、エラーメッセージの34行目から行数の数字がただひたすら上に上がっていって、今はわけわかんない状態になってます。 (2)リンクの有った例文を参考に書き換えたところ、 <?php $url = "省略"; $user = "省略"; $pass = "省略"; $db = "省略"; $link = mysqli_connect($url,$user,$pass); /* 接続状況をチェックします */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } if (!mysqli_query($link, "SET a=1")) { printf("Errormessage: %s\n", mysqli_error($link)); } /* 接続を閉じます */ mysqli_close($link); ?> こうするとエラー文が以下の通りでした。 Errormessage: Unknown system variable 'a' 接続ID: Catchable fatal error: Object of class mysqli could not be converted to string in C:\Program Files\Apache\Apache24\htdocs\sample\ファイル名.php on line 30
> 以下のエラーが出ました。 失敬、コード間違えました。正しくはこうです。 $sdb = mysqli_select_db($link, $db) or die("データベースの選択に失敗しました。" . mysqli_error($link)); >>もっとも、今回の場合は・・・・ > $link と $sdbをまとめるイメージですか? 今は 1. 引数3つの mysqli_connect でデフォルトDBに接続 2. mysqli_select_db で 省略 DB に移動 という2段階で処理していますが、最初から 1. 引数4つの mysqli_connect で 省略 DBに接続 で処理したらいかがでしょう、ということです。 「デフォルトDBにいったん接続して省略 DB に移動」なんて無駄以外の何物でもありません。
補足
訂正有難うございます。今度は以下のエラーが出ました。 Warning: mysqli_query() expects parameter 1 to be mysqli, string given in C:\Program Files\Apache\Apache24\htdocs\sample\ファイル名.php on line 15 クエリの送信に失敗しました。 SQL:select * from テーブル名 >1. 引数4つの mysqli_connect で 省略 DBに接続で処理したらいかがでしょう そうですね、今度書くときはそれを心がけます。
今のエラー内容では何が何だかわかりません。もう少し詳しいエラーメッセージが出るようにして再実行しましょう。 $sdb = mysqli_select_db($link, $db) or die("データベースの選択に失敗しました。" . mysqli_error()); もっとも、今回の場合は mysqli_select_db など最初から使わずに mysqli_connect($url, $user, $pass, $db) で接続したほうが良いと思いますけどね…。
補足
早速回答有難うございます。 以下のエラーが出ました。 Warning: mysqli_query() expects parameter 1 to be mysqli, string given in C:\Program Files\Apache\Apache24\htdocs\sample\kensaku6.php on line 16 クエリの送信に失敗しました。 SQL:SELECT * FROM uriage >もっとも、今回の場合は・・・・ $link と $sdbをまとめるイメージですか?
お礼
そうですね、これいじょう長く引っ張るのも申し訳ないのでこれで打ち止めとさせていただきます。何度も有難うございました。
補足
>PassWd という列があるのですか? すみません。列が単に一致していませんでした。解決いたしました。