2

私はチュートリアルや例を使用し、問題に関する他の多くの質問を調べましたが、それでも機能させることができません。私はPHPに比較的慣れておらず、PDOについてまったく理解していません。大学から提供された減価償却されたコードを取り除くために、コードをmysqlではなくmysqliに変更しましたが、この状況ではあまり役に立ちませんでした。

誰かが私のためにこの問題に光を当てることができれば、私は非常に感謝するでしょう。以下は私のコードサンプルです:

<?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ており、過去数日間これに固執しています。前もって感謝します。

4

2 に答える 2

3

マルチSQLクエリが有効になっているかどうかを最初にウェブホストに確認する必要があります。

一部のウェブホストでは、インジェクション攻撃を防ぐために単一の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
    ...
}

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

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

function executeQuery($sql) {
    global $db; # use $db in the global scope
    $query = $db->prepare($sql); # works fine
    ...
}
于 2012-04-17T15:22:59.390 に答える
0

警告から、それが$linkmysqliオブジェクトではないことは明らかです。接続しなかったか、ある時点で別の場所に再割り当て$linkしました。

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

また、mysqliのオブジェクト指向および手続き型のインターフェースを組み合わせて使用​​しないでください。オブジェクト指向のスタイルははるかに明確ですが、既存のコードを変更するのが難しすぎる場合は、手続き型のスタイルに固執してください。

代わりに次のように接続します。

$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());
}

また、これが実際のコードではないことを願っています。これは、mysqlインジェクション攻撃に対して広く開かれているためです。マルチクエリの使用を完全にやめ、プレースホルダー付きのプリペアドステートメントを使用することを検討してください。

于 2012-04-17T15:29:01.130 に答える