2012-04-17 20 views
1

私はチュートリアルやサンプルを使用していましたが、私の問題に関する他の多くの質問を見てきましたが、まだ動作させることができません。PHPには比較的新しいので、PDOを理解していません。私の大学が私に与えた償却されたコードを取り除くためにmysqlではなくmysqliに自分のコードを変更しましたが、この状況では役に立たなかったのです。mysqli_multi_queryがmysql dbに挿入されていません

誰かが私にとってこの問題に少しでも光を当てることができたら、私はとても感謝しています。以下 は私のコードサンプルである:

<?php /*connect to the db */ 
    $link=mysqli_connect("dbhost","user","pass"); 
    mysqli_select_db("db",$link); 

    /*checking connection*/ 
     if ($link->connect_errno) 
     throw new exception(sprintf("Could not connect: %s", $link->connect_error)); 

session_start(); 



     $insert_query=" 
     INSERT INTO testone_tbl (age,hours,flexibility,fastpaced,retailexp, 
     workedus,conviction,permit,education) 
     VALUES ('$age','$hours','$flexibility','$fastpaced','$retailexp','$workedus', 
     '$conviction','$permit','$education'); 
     INSERT INTO testtwo_tbl 
     (contribute,insales,initiative,success,alternatives,targets, 
     newthings,custfeed,incdevelop,standards,confident,stretch, 
     opportunities,polite,ideas,deadline,supported,duties) 
     VALUES ('$contribute','$insales','$initiative', 
     '$success','$alternatives','$targets','$newthings', 
     '$custfeed','$incdevelop','$standards','$confident','$stretch', 
     '$opportunities','$polite','$ideas','$deadline','$supported','$duties')"; 


    /*execute multi_query*/ 


mysqli_multi_query ($link, $insert_query);/*error1*/ 
/*close connection*/ 
if(!$link>connect_errno) $link->close(); /*error2*/ 

?> 

データは、これは(最終形態)で記述されており、以前のフォームからセッションされるフォームの両方からなります。しかし、私もこのエラーが発生しています:警告:mysqli_multi_query()はパラメータ1がmysqliで、Warning: mysqli_close() expects parameter 1 to be mysqliと予想しています。前もって感謝します。

+0

このコードは実行されません(引用符がありません)。コピー貼り付けを確認してください。 –

+0

編集された、私は人々にコードを投げないようにいくつかのINSERTを残し、終了ビットを逃した。 – PurpleSmurph

答えて

2

複数のSQLクエリを有効にしているかどうかは、Webホストで最初に確認する必要があります。

一部のWebホストでは、単一SQLクエリのみが注入攻撃を防ぐのに役立ちます。しかし、あなたが同じテーブルへの挿入をマルチにしたい場合は

は、あなたはこのようにそれを行うことができます:

また
INSERT INTO tbl_name (col1, col2) 
    VALUES ('?', '?'), 
      ('?', '?'), 
      ('?', '?'); # inserts 3 records to the same table in one query 

あなたはあなたに利用できるPDOを持っている場合は、それを使用します!

PDOオブジェクトでは、プリペアドステートメントを使用することでより安全なクエリーになります。例:データベース抽象化レイヤを作成した場合

$db = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); 

$data = array($col1, $col2, $col3); 
$sql = "INSERT INTO tbl_name (col1, col2, col3) VALUES ('?', '?', '?');"; 
$query = $db->prepare($sql); # prepares the sql statement 
$query->execute($data); #binds the array of data to the ? 
         #question mark parameters, and executes. 

、あなたがあなたのクエリを実行し、あなたのコードを書き換えることなく、データベースの接続モードを変更することができます。

また、ループやクエリを行わない理由もありますか?例:

$sql_array = array("INSERT INTO tbl_one(col1) VALUES '?';", 
      "INSERT INTO tbl_two(col3) VALUES '?';"); 

function performAll($sql_array) { 
    # execute all of the queries 
} 

データベース接続にアクセスするための機能を使用している可能性があります。あなたが実際に関数内からデータベース接続にアクセスしようとしていない限り、これは問題ではありません。例:

$db = new PDO("...", $user, $pass); 

$query = $db->prepare($sql); # works fine 

function executeQuery($sql) { 
    $query = $db->prepare($sql); # error: $db is not defined 
           # within the scope of this function 
    ... 
} 

これを回避するには、PHPでglobalキーワードを使用します。例:

$db = new PDO("...", $user, $pass); 

function executeQuery($sql) { 
    global $db; # use $db in the global scope 
    $query = $db->prepare($sql); # works fine 
    ... 
} 
+0

私がこれに新しいので、ループしていない私の理由は、私はPDOを理解していません。しかし、ループとクエリの考えは良く見えるようです。 mysqli_multi_queryを有効にしたことを確認するために私のWebホストにメールを送りました。私はループ/アレイの考え方を見ていきます。ありがとうございます。 (col)の意義は何ですか? – PurpleSmurph

+0

この場合、 'col'は' tbl_name'のフィールド名です。私はあなた自身のテーブル/フィールド名を使用するのではなく、自分の答えを汎用的に保ちました。興味のない、あなたのコードでSINGLE行のクエリを実行していますか? @PurpleSmurf – Ozzy

+0

それはすべてのmysql_などでしたが、私はそれが私が問題を抱えているmysqliに変更しました。ああ、それをクリアしてくれてありがとう、私が何を見ていたのか分からなかった。したがって、たとえば: ( "INSERT INTO tbl_one(age)VALUES 'data'、(age2)VALUES 'data2'";など – PurpleSmurph

0

$linkはmysqliオブジェクトではありません。あなたが接続していないか、またはある時点で$linkを別のものに再割り当てしました。

また、接続直後に接続を確認する必要があります。リンク上の中間アクション(この場合はmysqli_select_db)は、設定されたエラーをすべてクリアします。

また、mysqliのオブジェクト指向および手続き型インタフェースを混在させたり、一致させたりしないでください。オブジェクト指向スタイルはもっとはっきりしていますが、既存のコードを変更するのが難しい場合は手続き型スタイルに固執してください。代わりに、このような

接続:それはMySQLのインジェクション攻撃に大きく開いているので

$link = mysqli_connect("dbhost","user","pass", "db"); // no need for an extra db select 
if (mysqli_connect_errno()) { 
    throw new Exception("Could not connect: ".mysqli_connect_error()); 
} 

はまた、私は、これはあなたの本当のコードではありません願っています。マルチクエリーの使用を完全に廃止し、プレースホルダでプリペアドステートメントを使用することを検討してください。

+0

クラップ、申し訳ありませんが、私はこれに間違ったコードをアップロードしました。私はこれを編集するための瞬間を与えました、私は残念ながらこれについて申し訳ありません! – PurpleSmurph

+0

コードを更新しました。 – PurpleSmurph

関連する問題