Mysqliに関する質問とエラー - LOAD DATA LOCAL INFILEは使用できない?

このQ&Aのポイント
  • Mysqliを使用してMysql⇒Mysqliに接続方法を変える事になりましたが、LOAD DATA LOCAL INFILEコマンドが使用できなくなりました。
  • MysqliではpreparedステートメントプロトコルでLOAD DATA LOCAL INFILEがサポートされていないため、エラーが発生しています。
  • 今回のエラーに対してのアドバイスをいただきたいです。
回答を見る
  • ベストアンサー

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
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.1

>> prepared コマンドが使用できないと見えるのですが、 そう見えますので、まずはprepareをqueryに変更してみては?(なので対のexecuteも不要) バインド変数を使用している様にも見えないですし、そもそも何故ここでprepareを呼んでいるのでしょう。

s02152170
質問者

お礼

御回答あろがとうございます。 仰るとおりです。 完全に思い違いをしておりました。 queryに変更し正常に終了出来ました。 ありがとうございました。

その他の回答 (1)

回答No.2

少し調べてみました。 http://dev.mysql.com/doc/refman/5.1/ja/sqlps.html Mysqlのマニュアルを見たところ、LOAD DATA INFILEは、対応していないようです。

s02152170
質問者

お礼

御回答ありがとうございます。 調べて頂きありがとうございます。 なんとか正常に登録する事が出来ました。 また何かありましたら、 どうぞ宜しくお願い致します。

関連するQ&A

  • 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
  • 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
  • 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
  • 「mysqli_fetch_assoc」で、プリペ

    「mysqli_fetch_assoc」で、プリペアドステートしたいのですが、「mysqli_stmt_fetch」との違いなどがよく分かりません。 下記リンク先、「test4.php」のコードを、「mysqli」手続き型用に書き換えていただけないでしょうか? ▽データの取得(SELECT) - MySQLへの接続 - PHP入門   http://www.phpbook.jp/tutorial/mysql/index6.html <希望内容> ・「mysql」→「mysqli」 ・「mysqli」手続き型 ・SELECT idの「id」部分を動的対応(プリペアドステート) ・可能なら(?)、「mysqli_stmt_fetch」ではなく、「mysqli_fetch_assoc」利用

    • ベストアンサー
    • 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
  • 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
  • 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
  • PDO で IN句を利用することができません

    PDOでIN句を使用しているのですが、正しく動作しません。 $stmt = $pdo->prepare('SELECT * FROM hoge where id in (?)'); $stmt->bindValue(1, '123, 456, 789'); $stmt->execute(); var_dump($stmt->fetchAll()); fetchAllを行っても複数のレコードがかえってこず、ヒットした最初の1行のレコードしか取得することができません。PDOでIN句を使用することはできないのでしょうか? DBMSはMySQLを使用して、PHPは5.2.6を使用しています。 ちなみに $stmt = $pdo->prepare('SELECT * FROM hoge where id in (?, ?, ?)'); $stmt->bindValue(1, 123); $stmt->bindValue(2, 456); $stmt->bindValue(3, 789); $stmt->execute(); では、fetchAll で複数のレコードが返ってきます。 どうしてもpreparedで単一のIN句を使いたいのですが、何か良い方法はありますでしょうか?

    • 締切済み
    • PHP
  • selectによるレコード取得結果の有無で条件分岐

    PHP(PDO)とMySQLでプログラムを組んでいます。 DBからselectでレコードを取得するのですが、もし該当するレコードが一件もない場合は404のエラーページにリダイレクトさせたいのですが、その場合の条件式は if(!$stmt->fetch()){ } で大丈夫でしょうか?一応下にプラグラムの抜粋を載せてみました。 他に何かよい方法がございましたら教えていただきたいです。 よろしくお願いします。 sql="SELECT・・・・"; $stmt=$db->prepare($sql); $stmt->bindParam(':・・',・・・']); $stmt->execute(); if(!$stmt->fetch()){ header("Location:・・・・"); } $stmt->execute(); while($row=$stmt->fetch()){ }

    • ベストアンサー
    • MySQL
  • PHP Mysqli関数でエラー情報を取得する

    はじめまして。 PHPから、Mysqli関数を使用して、5000件のinsert文をMySQLサーバーに投げる処理で困っています。 insert文をセミコロン;で接続して、1つのSQL文にして、executeしています。 あるinsert文でエラーが発生した場合、それ以降のSQL文が実行されずに、PHPに戻ってきてしまいます。マルチクエリの挙動としては、この動きはしょうがないのでしょうか? 5000件のうち、複数のエラー(キー重複や、外部参照キーエラー)があった場合、エラーが起きたデータについてはどのようなエラーであったかが取得でき、それ以降のデータについてはinsertが実行できると言う処理をしたいのですが、このような処理は不可能でしょうか。 ちなみにupdateの場合は、更新対象のデータがなかった場合でもエラーとはならないので5000件文の処理が行われます。 環境は、以下です。 OS:FreeBSD6 PHP:PHP5 MySQL:MySQL5.2 よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう