0

何らかの理由で、php 経由で実行すると失敗する SQL 挿入がいくつかありますが、phpmyadmin に直接貼り付けた場合は失敗しません。

PHPコードは次のとおりです。

private function createMockAccount($email){
    $passwordHash=$this->nonce();
    $query='insert into GeneralUser(email,password,isTemp) values("'.$email.'","'.$passwordHash.'",1);';
    $query=$query.'insert into ContentUser(email) values("'.$email.'");';
    error_log("executing the following query to create mock accounts: ".$query);
    $database=mysqli_connect(host,username,password,dbName);
    if (mysqli_connect_errno()) {
         error_log("Connect failed: ".mysqli_connect_error());
    }
    if(!mysqli_query($database,$query)){
     error_log("Errormessage:".mysqli_error($database));    
    }
    return $passwordHash;
}

実行すると、エラー ログに次のように表示されます。

[11-Aug-2013 04:20:42 America/Denver] executing the following query to create mock accounts: insert into GeneralUser(email,password,isTemp) values("suxhfisk@guerrillamail.biz","D0Obkg/Lue+4AFSAzinqdo/XAAwDhMfitmnm53R0RwA=",1);
        insert into ContentUser(email) values("suxhfisk@guerrillamail.biz");
[11-Aug-2013 04:20:42 America/Denver] Errormessage:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'insert into ContentUser(email) values("suxhfisk@guerrillamail.biz")' at line 2

また、次の方法で mysqli_real_escape_string を使用してみましたが、役に立ちませんでした。

$query=mysqli_real_escape_string($database,$query);

それで、error_logにはまだ同じエラーが表示されます...

[11-Aug-2013 04:51:42 America/Denver] executing the following query to create mock accounts: insert into GeneralUser(email,password,isTemp) values("suxhfisk@guerrillamail.de","guR8Sps8e4Iv1LBXmsREH2GVd+WH/cH1Nx/zy9VOnLE=",1);
        insert into ContentUser(email) values("suxhfisk@guerrillamail.de");
[11-Aug-2013 04:51:42 America/Denver] Errormessage:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\"suxhfisk@guerrillamail.de\",\"guR8Sps8e4Iv1LBXmsREH2GVd+WH/cH1Nx/zy9VOnLE=\",1' at line 1

ばかげた何かが欠けていると確信していますが、どちらの場合も、error_log からの文字列が phpmyadmin に直接コピーされると、正常に実行されます。

どんな助けでも大歓迎です、ありがとう!:)

4

2 に答える 2

0

これは実行中のクエリではなく、一連のクエリです。
したがって、1 つのステートメントではなく、1 つずつ実行してください。

また、使用するというあなたの考えmysqli_real_escape_stringはかなり間違っています。この関数は、クエリ全体を処理するのではなく、文字列リテラルの特殊文字をエスケープするためにのみ使用する必要があります。

とにかく、代わりに準備済みステートメントを使用する必要があります。その使用法は生の mysqli では非常に複雑であるため、代わりにPDOを使用することを検討してください。

于 2013-08-11T11:53:22.013 に答える
-1

phpmyadmin クエリ ウィンドウは、各改行 (したがって、';' の後) トークンを 1 つのタスクとして処理します。これにより、一度に複数のクエリを実行できます。PHP で同じことを実現したい場合は、トランザクションを使用する必要があります。以下に例を示します。

try {
    // start transaction
    $db->beginTransaction();
    // do 1st query 
    $db->query("insert into GeneralUser(email,password,isTemp) values('" . $email . "', '" . $passwordHash . "',1);");
    // do 2nd query
    $db->query("insert into ContentUser(email) values('" . $email . "');");
    // commits the operation
    $db->commit();
}
catch(Exception $e) {
    // either echo or log the error message
    // rollback the above successful query (optional, but depends of your design)
    $db->rollback();
}

または、代わりにPDOを使用してください。

于 2013-08-11T12:03:36.447 に答える