mysqli_stmtエラーの修正方法とは?

このQ&Aのポイント
  • mysqli_stmtエラーの修正方法が知りたいです。
  • mysqli_stmtエラーの対処法を教えてください。
  • mysqli_stmtエラーの解決策を教えてください。
回答を見る
  • ベストアンサー

mysqli_stmtエラーの修正方法がわからない

以下のエラーがわかりません。 Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in C:\xampp\htdocs\job_site4\search_criteria.php on line 62 Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement in C:\xampp\htdocs\job_site4\search_criteria.php on line 68 Warning: printf(): Too few arguments in C:\xampp\htdocs\job_site4\search_criteria.php on line 73 というエラーになりました。 以下ソースです。 /* 変数定義関連 */ /* mysqliの定義 */ global $mysqli; $mysqli = new mysqli('localhost', 'root', "", "db"); //$link = mysqli_connect('localhost', 'root', "", "db"); /* 接続状況をチェックします */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } print("<BR>"); /* 現在のデフォルトデータベース名を返します */ if ($result = $mysqli->query("SELECT DATABASE()")) { $row = $result->fetch_row(); printf("Default database is %s.\n", $row[0]); $result->close(); } print("<BR>"); /* データベースを a_db に変更します */ $mysqli->select_db("a_db"); /* 現在のデフォルトデータベース名を返します */ if ($result = $mysqli->query("SELECT DATABASE()")) { $row = $result->fetch_row(); printf("Default database is %s.\n", $row[0]); $result->close(); } // データベースのdump echo "<pre>";var_dump($mysqli);echo "</pre>"; /* プリペアドステートメントを作成します */ $sql = " SELECT * FROM `test_table` WHERE 1 "; // バインドデータ設定 $key = 1; if($stmt = $mysqli->prepare($sql)) { /* マーカにパラメータをバインドします */ $stmt->bind_param("i",$key); // バインドする変数に設定して送る /* クエリを実行します */ $stmt->execute(); /* 結果変数をバインドします */ $stmt->bind_result($col1,$col2); // バインドする変数分設定 /* 値を取得します */ $stmt->fetch(); printf("%s : %s\n", $col1.$col2); /* ステートメントを閉じます */ $stmt->close(); } // 切断 $mysqli->close(); よろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数3

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>$sql = " >SELECT * >FROM >`test_table` >WHERE >1 > >"; prepareするSQL文($sql)にプレースホルダがありません。bind_paramする以上は、どの部分を置換するのかプレースホルダで指示しておかないとダメです。

kmwrod
質問者

お礼

まだよくわかっていませんが、 $sql = " SELECT * FROM `test_table` WHERE name=? "; としたところ、エラーが全て消えました!! 本当にありがとうございました。 ベストアンサーとさせて頂きます。

関連するQ&A

  • mysqliを使ってデータベースを表示したい3

    http://okwave.jp/qa/q8228275.html の続編です。 何度もすみません、エラーは消えたのですが、やりたいことが実現できていないので、質問します・・・ mysqliを使ってデータベースを表示したいのですが、肝心の表示部分ができません。 printでテストしてみたのですが、中身が入っていない?ようなのです。 よくわからないので、教えて頂きたいです。 DBはphpmyAdminで作成しました。 /* 変数定義関連 */ /* mysqliの定義 */ global $mysqli; $mysqli = new mysqli('localhost', 'root', "", "***_db"); //$link = mysqli_connect('localhost', 'root', "", "***_db"); /* 接続状況をチェックします */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } print("<BR>"); /* 現在のデフォルトデータベース名を返します */ if ($result = $mysqli->query("SELECT DATABASE()")) { $row = $result->fetch_row(); printf("befor Default database is %s.\n", $row[0]); $result->close(); } print("<BR>"); /* データベースを ***_db に変更します */ $mysqli->select_db("***_db"); /* 現在のデフォルトデータベース名を返します */ if ($result = $mysqli->query("SELECT DATABASE()")) { $row = $result->fetch_row(); printf("change after Default database is %s.<BR><BR>", $row[0]); $result->close(); } // データベースのdump echo "↓start_dump<BR>"; echo "<pre>";var_dump($mysqli);echo "</pre>"; echo "↑end_dump<BR>"; // バインドデータ設定 $key = 'c_name'; $num = 1; /* プリペアドステートメントを作成します whereの箇所はプレースホルダ(xxx=?)をつけること! */ /* 「*」 はダメってこと?ちゃんと指定しないとbind_resultでエラー?*/ $sql = "SELECT c_name,c_job,c_prace,c_working_time,c_salary,c_treats,c_capacity,c_person,c_process,c_interview_day,c_person_in_charge,c_single_word,c_contact,c_web_site,c_condition FROM `test_table` WHERE c_name=?"; $stmt = $mysqli->prepare($sql); //printf("実行SQL<BR>"); //printf("%s<BR>",$sql); if($stmt = $mysqli->prepare($sql)) { //printf("%s<BR>",$stmt); /* マーカにパラメータをバインドします */ //バインドする変数はprepareで読み込んだ変数個数?のみ $stmt->bind_param('i', $num); // バインドする変数に設定して送る /* クエリを実行します */ $stmt->execute(); /* 結果変数をバインドします */ //戻り値と全ての項目の変数名を関連付ける(項目1~16)※SELECTの数と合わせること。 $stmt->bind_result($col1,$col2,$col3,$col4,$col5,$col6,$col7,$col8,$col9,$col10,$col11,$col12,$col13,$col14,$col15); //$stmt->bind_result($col1,$col2); // バインドする変数分設定 //$num = $stmt->fetch();//debug用 //printf("<BR>%s\n", $num); printf("testes\n"); printf("%s",$col1); printf("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\n\n\n",$col1,$col2,$col3,$col4,$col5,$col6,$col7,$col8,$col9,$col10,$col11,$col12,$col13,$col14,$col15); /* 値を取得します */ while ($stmt->fetch()){ printf("testes");//入ってない printf("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\n",$col1,$col2,$col3,$col4,$col5,$col6,$col7,$col8,$col9,$col10,$col11,$col12,$col13,$col14,$col15); } printf("<BR>num=%s\n", $num); /* ステートメントを閉じます */ $stmt->close(); } // 切断 $mysqli->close(); dumpは以下の通りに出ます object(mysqli)#1 (19) { ["affected_rows"]=> int(1) ["client_info"]=> string(75) "mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $" ["client_version"]=> int(50010) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(1) ["host_info"]=> string(20) "localhost via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(6) "5.5.32" ["server_version"]=> int(50532) ["stat"]=> string(134) "Uptime: 6961 Threads: 1 Questions: 1535 Slow queries: 0 Opens: 100 Flush tables: 1 Open tables: 1 Queries per second avg: 0.220" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(152) ["warning_count"]=> int(0) }

    • 締切済み
    • PHP
  • mysqliを使ってデータベースを表示したいのです

    http://okwave.jp/qa/q8227809.html の続編です。 バインドのところでエラーが出ているようなのですが、原因と修正方法がわかりません。 /* プリペアドステートメントを作成します whereの箇所はプレースホルダ(xxx=?)をつけること! */ $sql = "SELECT * FROM `test_table` WHERE c_name=?"; $stmt = $mysqli->prepare($sql); if($stmt = $mysqli->prepare($sql)) { /* マーカにパラメータをバインドします */ $stmt->bind_param('i', $num); // バインドする変数に設定して送る /* クエリを実行します */ $stmt->execute(); /* 結果変数をバインドします *//*69行目付近*/ $stmt->bind_result($num); /* 値を取得します */ $stmt->fetch(); printf("<BR>%s\n", $num); /* ステートメントを閉じます */ $stmt->close(); } // 切断 $mysqli->close(); Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement in C:\xampp\htdocs\job_site4\search_criteria.php on line 69 というエラーが出ます。 解決方法を教えていただきたいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Mysqliに関して

    すいません、分かる方いましたら宜しくお願いします。 php ver 5.16 Mysql ver 5.0.95 今回Mysql⇒Mysqliに接続方法を変える事になりまして、 今勉強しながら修正しています。 1個問題があり、不明点が御座います。 ファイルをDBに取り込むLOAD DATA LOCAL INFILEコマンドを使用していたのですが、 Mysqliを使用したら下記エラーになり使用できなくなりました。 This command is not supported in the prepared statement protocol yet prepared コマンドが使用できないと見えるのですが、 MysqliはOAD DATA LOCAL INFILEは使用できないものでしょうか?? プログラムは簡易ですがこんな感じです。 $mysqli = new mysqli($sv, $user, $pass, $dbname); //オートコミットを停止 $mysqli ->autocommit(FALSE); $stmt = $mysqli->prepare("SET NAMES utf8"); $stmt->execute(); $sql="LOAD DATA LOCAL INFILE '"・・・ //ここでエラー if (($stmt = $mysqli->prepare($sql)) === false) {   $result = false; die($mysqli->connect_error); $mysqli->close(); } $stmt->execute() or exit("bind errorn"); アドバイス頂けると助かります。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHPでDBから比較結果を取得する関数が作りたい

    タイトルの通りで、まず、データベース(MySQL)の例を以下。 ユーザー    単語  田中    初志貫徹  鈴木    一石二鳥  品川    四面楚歌 /***以下省略****/ のような感じでデータが入っています。 (なお、ユーザーは一意な値となっています。単語は重複します。およそ2万件登録されています。) ユーザーの名前を入力するとDB内を参照し、その組となる単語を出力する関数を考えています。 一応、以下のように作ってみたのですが、5つのテストデータを呼び出すだけで、3sもかかってしまいました。(PHP ver 5.4.1.6 eAccelerator適応済み環境にて確認) 比較処理の速度が遅く、使い物になりません。 もっと実行速度が速くなるような書き方を教えていただけないでしょうか? よろしくお願いいたします。m(_ _)m /************以下、関数のソースコード*********/ function conp_db($name){ //DBアクセス用変数 $cflag=true; $host = HOST; $user = USER; $password = PASSWORD; $database = DB; $table = TABLE; $data=''; $res = mysqli_connect($host, $user, $password,$database); if(!$res) { printf("MYSQLの接続に失敗しました。: %s\n",mysqli_connect_error()); exit(); } mysqli_set_charset($res,'utf8'); if($stmt = mysqli_prepare($res, "SELECT user,word from {$table}")) { mysqli_stmt_execute($stmt); //取得変数固定 mysqli_stmt_bind_result($stmt,$row['user'],$row['word']); while (mysqli_stmt_fetch($stmt) and $cflag) { if($name === $row['user'] and $cflag){ $data = $row[word']; $cflag = false; }else{ $data = 'nobody'; } } mysqli_stmt_close($stmt); } mysqli_close($res); return $data; }

    • ベストアンサー
    • PHP
  • mysqliについて

    <?php //DB設定 $DB_HOST = 'mysql**.db.sakura.ne.jp'; $DB_USER = 'sakura'; $DB_PASS = '0000'; $DB_NAME = 'members'; $link = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); if (mysqli_connect_errno()) { die('データベースエラー'); } ・ ・ ・ ?> ただこの記述ですとローカルで作成した場合は表示されるのですが、サーバーにあげると表示されなくなってしまいます。 エラー表示が 「Call to undefined function mysqli_connect() in /***/***/***/login.php on line **」 とでます。 **はちょうど $link = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); が表示されているところになります。 mysqliをmysqlに変更しても表示されません。 初心者のためまったくわけがわかりません。 サーバーはsakuraを使用しています。 MySQL のバージョンは5.1 PHP の バージョンは 5.2.12 お分かりの方がいらっしゃいましたらご教授いただければと思います。

    • 締切済み
    • PHP
  • connectを使ったSQL実行でエラー

    以下のphpでsql文を実行したのですが、エラーになってしまいます。 sql文が間違っているのでしょうか?phpmyadminで作成したsqlを貼り付けたのですが・・・ どなたか回答お願いします。 header("Content-type: text/html; charset=shift-jis"); #mysql_connectを使う #mysqliの定義 $mysqli = new mysqli('localhost', 'root', "", "******"); $link = mysql_connect('localhost', 'root', "", "*********"); if (!$link) { die("1:接続失敗です。".mysql_error()); }else{ print("1:接続成功!<BR>"); } // 文字化け防止 /* 文字セットを utf8 に変更します */ if (!$mysqli->set_charset("utf8")) { printf("2:文字コードのセットに失敗しました。: %s\n", $mysqli->error); } else { printf("2:文字コードセット-> %s\n", $mysqli->character_set_name()); } printf("<BR>"); $query = file_get_contents("./sql/create.sql"); printf("3:クエリ->%s",$query);#ちゃんと読み込まれているかクエリ確認 $stmt = $link->prepare($query); $stmt->execute(); // 変数のバインド $stmt->bind_result($name,$email); // 表示 while ($stmt->fetch()) { echo $name; echo $email; } //切断 $mysqli->close(); ------------------------------------------------- :実行結果 1:接続成功! 2:文字コードセット-> utf8 3:クエリ->SELECT * FROM test_table WHERE 1 Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdoc\saaaaa\aaaaa.html on line 41

    • 締切済み
    • PHP
  • php+mysqlでの重複チェックについて

    phpからCSVに吐き出して重複チェックを考えていたのですが 大変そうなので、mysqlを導入し、php+mysqlで重複チェックを行なうことにしました。 nameをユニークインデックスにしたところ 同じ名前は登録されなくなったのですが できれば、「その名前は登録済みです!」と表示させたいです。 エラーコードかなにかを使って 判断するのでしょうか? 以上、宜しくお願いいたします。 -----文字数の関係で一部削除しております。----- <?php //DBへ接続開始 $link = mysqli_connect($host, $user, $password, $database); if (!$link) { print("接続できませんでした"); exit(); } /* 文字セットを utf8 に変更します */ mysqli_set_charset($link, "SJIS"); //オートコミットOFF mysqli_autocommit($link, FALSE); // ステートメントの設定 $sql = 'INSERT INTO not_schoolmate (id,name,) VALUES(?,?)'; $stmt = mysqli_prepare($link, $sql); mysqli_stmt_bind_param( $stmt,"ss", $id, $name ); // 値設定 if($errflg == 0){ $id = $_POST["id"]; $name = $_POST["name"]; //SQL文を実行する mysqli_stmt_execute($stmt); //コミットする mysqli_commit($link); //ステートメントクローズ mysqli_stmt_close($stmt); ?>

    • ベストアンサー
    • PHP
  • 実行結果に連番を振る方法

    こんにちは。 以下を実行すると、ブラウザに結果x, 結果x, 結果x・・・と表示されます。 xの部分を1, 2, 3・・・とさせたいのですが、うまくできません。 ご教示頂けませんか? 宜しくお願い致します。 <?php //データベース接続 $server = "127.0.0.1"; $userName = "root"; $password = "password"; $dbName = "tweet01"; $mysqli = new mysqli($server, $userName, $password,$dbName); if ($mysqli->connect_error){ echo $mysqli->connect_error; exit(); }else{ $mysqli->set_charset("utf-8"); } $sql = "SELECT * FROM tweet_tbl"; $result = $mysqli -> query($sql); //クエリー失敗 if(!$result) { echo $mysqli->error; exit(); } //レコード件数 $row_count = $result->num_rows; //連想配列で取得 while($row = $result->fetch_array(MYSQLI_ASSOC)){ $rows[] = $row; } //結果セットを解放 $result->free(); // データベース切断 $mysqli->close(); ?> <!DOCTYPE html> <html> <body> <table border='1'> <tr><td>結果</td></tr> <?php foreach($rows as $row){ ?> <tr> <td><a href='wxyz.php?id=$row['id']; ?'>結果x</a></td> </tr> <?php } ?> </table> </body> </html>

    • ベストアンサー
    • PHP
  • PHPとMySQLとの連携エラー

    環境はWin 8.1, Apache 24, PHP 5.5.6, MySQL 5.5です。 My SQLとの連携で、以下のエラーが出てしまいました。 ---------------------------------------------エラー文ここから Warning: mysqli_select_db() expects parameter 1 to be mysqli, string given in C:\Program Files\Apache\Apache24\htdocs\sample\省略.php on line 11 データベースの選択に失敗しました。 ---------------------------------------------エラー文ここまで ---------------------------------------------コードここから <?php $url = "省略"; $user = "省略"; $pass = "省略"; $db = "省略"; // mysqliへ接続 $link = mysqli_connect($url,$user,$pass) or die("mysqliへの接続に失敗しました。"); // データベースを選択する $sdb = mysqli_select_db($link, $db) or die("データベースの選択に失敗しました。"); // クエリを送信する $sql = "SELECT * FROM省略"; $result = mysqli_query($sql, $link) or die("クエリの送信に失敗しました。<br />SQL:".$sql); //結果セットの行数を取得する $rows = mysqli_num_rows($result); //結果保持用メモリを開放する mysqli_free_result($result); // mysqliへの接続を閉じる mysqli_close($link) or die("mysqli切断に失敗しました。"); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=SHIFT-JIS"> <title>全件表示</title> </head> <body> 接続ID:<?= $link ?><br /> 選択の成否:<?= $sdb ?><br /> 結果ID:<?= $result ?><br /> 行数:<?= $rows ?><br /> </body> </html> ---------------------------------------------コードここまで 11行目はコメント文「データベースを選択する」です。 ただ、実際の間違いはその下ですよね? ネットで検索してみたつもりですが、良い情報はありませんでした。 直訳を考えると、mysqli_select_db($link の部分がmysqliであるべきなんですか? 少なくともmy SQLへの接続には成功していると取っていいのでしょうか?

    • ベストアンサー
    • PHP
  • データベース接続 ログインフォーム

    PHPにてログインフォームを作成しています。 PHPは初心者のため、ご教授いただけたらと思います。 下記の記述方法はPHP逆引きレシピという参考書を元に作成しています。 <?php //DB設定 $DB_HOST = 'localhost'; $DB_USER = 'root'; $DB_PASS = '0000; $DB_NAME = 'members'; if (count($_POST) == 0) { echo <<< EOL <form method="post" action="./main.php"> ユーザーID: <input name="id" /> PASSWORD: <input name="password" type="password" /> <input type="submit" value="ログイン" /> </form> EOL; } else { $link = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); if (mysqli_connect_errno()) { die('データベースエラー'); } // クエリを準備 $sql = 'SELECT * FROM members WHERE id=? AND password=?'; $msg = '認証NG'; if ($stmt = mysqli_prepare($link, $sql)) { mysqli_stmt_bind_param($stmt, 'ss', $_POST['id'], $_POST['password']); mysqli_stmt_execute($stmt); mysqli_stmt_store_result($stmt); $count = mysqli_stmt_num_rows($stmt); mysqli_stmt_close($stmt); if ($count == 1) { $msg = '認証OK' ; } } echo $msg; } ?> という記述ですが、IDとPASSWORDがあっていれば「認証OK」と表示されます。 文字の表示ではなく次のページ(main.php)が表示されません。 どこを編集、記述したらmain.phpが表示されるのでしょうか? また、間違っていたら「認証NG」と表示されるのですが、 この文言のみの表示でフォームが表示されません。 間違っていたらフォームの上に表示させたいのですが、どのように編集、記述したらよろしいでしょうか? 例↓ *ここに間違っていたら認証NGと表示させる <form method="post" action="./main.php"> ユーザーID: <input name="id" /> PASSWORD: <input name="password" type="password" /> <input type="submit" value="ログイン" /> </form> 質問ばかりで申し訳ありません。 本やネットなどで色々としらべたのですが、自分の求めているサイトや記述方法が見つかりませんでした。 大変申し訳ないのですが、参考記述または参考サイトなどがありましたらご教授ください。 宜しくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう