9

ファイルをアップロードし、mysqli を使用して「画像」テーブルにデータを挿入する以下のコードを使用しています。

<?php
session_start();

$username="xxx";
$password="xxx";
$database="mobile_app";

$mysqli = new mysqli("localhost", $username, $password, $database);

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    die();
}

$result = 0;

//UPLOAD IMAGE FILE

move_uploaded_file($_FILES["fileImage"]["tmp_name"], "ImageFiles/" . $_FILES["fileImage"]["name"]);

$result = 1;

//INSERT INTO IMAGE DATABASE TABLE

$imagesql = "INSERT INTO Image (ImageFile) VALUES (?)";

if (!$insert = $mysqli->prepare($imagesql)) {
    // Handle errors with prepare operation here
}

//Dont pass data directly to bind_param store it in a variable
$insert->bind_param("s", $img);

//Assign the variable
$img = 'ImageFiles/' . $_FILES['fileImage']['name'];

$insert->execute();

//RETRIEVE IMAGEID FROM IMAGE TABLE

$lastID = $mysqli->insert_id;

//INSERT INTO IMAGE_QUESTION DATABASE TABLE

$imagequestionsql = "INSERT INTO Image_Question (ImageId, SessionId, QuestionId) VALUES (?, ?, ?)";


if (!$insertimagequestion = $mysqli->prepare($imagequestionsql)) {
    // Handle errors with prepare operation here
}

$sessid =  $_SESSION['id'] . ($_SESSION['initial_count'] > 1 ? $_SESSION['sessionCount'] : '');

$insertimagequestion->bind_param("sss", $lastID, $sessid, $_POST['numQuestion'][$i]);

$insertimagequestion->execute();

//IF ANY ERROR WHILE INSERTING DATA INTO EITHER OF THE TABLES
if ($insert->errno) {
  // Handle query error here
}

$insert->close();

if ($insertimagequestion->errno) {
  // Handle query error here
}

$insertimagequestion->close();

}

}
?>

たとえば、2 つの画像 "cat.png" と "dog.png" を "Image" データベース テーブルに挿入すると、次のように挿入されます。

ImageId         ImageFile

220             cat.png
221             dog.png

(ImageId は自動インクリメントです)

とにかく私がやりたいことは、ファイルがアップロードされたときに、データが上のテーブルに挿入されるだけでなく、上に挿入された ImageId を取得して、下の「Image_Question」テーブルに配置できるようにしたいということですしたがって、次のようになります。

 ImageId         SessionId      QuestionId

    220             cat.png      1
    221             dog.png      4

問題は、2番目のテーブル「Image_Question」にデータが挿入されていないことです。データが挿入されていない理由を知っている人はいますか? php ファイルにエラーはありません。

ファイルをアップロードするには、ユーザーは「QandATable.php」ページで ajax アップローダー用のファイルを選択します。ユーザーがアップロードをクリックすると、AJAX を使用して imageupload.php ページに移動し、そこでアップロードを行います。したがって、私が抱えている問題は、別のページにあるため、エラーが表示されないことです。

4

7 に答える 7

5

まず、レコードの追加で取得した挿入 ID を保存します ($insert->execute の後):

$lastID = $mysqli->insert_id;

その後、後で $lastID を参照します。

下から私のコメントを引き出すには:

$lastID = $insert->insert_id;

$mysqli、$insert などのハンドル名を交換することに関係していると思います。

質問を正しく読んでいただければ幸いです...

于 2012-07-23T16:48:36.867 に答える
1

500 ErrorFirebug -> Net tab/Chrome Developer tools -> Network tab で応答を確認します。テキストとして何も返されない場合でも、論理エラーではなく、構文/意味エラーをデバッグするのに役立ちます。

于 2012-08-10T05:15:07.380 に答える
0

まず、$ lastIDをエコーするとどうなりますか?画面に値が出力されますか?

そうでない場合は、$ lastIDが正しい値を返すように、最初にそれを修正する必要があります。

挿入コードは正しいようです。

于 2012-07-28T22:11:03.390 に答える
0

どこで失敗する可能性があるかを理解しようとしました。

2番目のクエリに問題はなく、最後の挿入IDを正常に取得できます。2番目のクエリの変数には静的な値を使用しましたが、正常に機能しました。値をハードコーディングしてチェックアウトすることもできます。

次のことに注意してください。

  1. バインドパラメータはすべての値を取得しますか?
print_r() $lastID, $sessid, $_POST['numQuestion'][$i] 
This Will not create problem unless database has contraints of not accepting empty or null values.
  1. チェック条件を利用して、どこが間違っているかを見つけます。
if (!$insertimagequestion = $mysqli->prepare("$imagequestionsql")) {
    // Handle errors with prepare operation here
    echo "Prepare statement err";
}

if ($insert->errno) {
  // Handle query error here
    echo "insert execution error";
}

そのajaxですが、Chomeの開発者ツールを使用してajaxリクエストをデバッグできます。

  1. F12キーを押して、Chromeでデベロッパーツールを開きます

  2. [ネットワーク]タブに移動します>>フォームで送信されるajaxリクエストのアクションを実行します>>送信されたajaxリクエストを見つけることができます>>それをクリックします>>[応答]タブをクリックすると、エコーした場合、または応答。したがって、デバッグに役立つエラーとprint_r()をエコーし​​ます

于 2012-08-08T07:32:49.617 に答える
0

最初のテーブルから最後に挿入された ID を取得し、2 番目のテーブル (Image_Question) に挿入する必要があります。

PHPのコーディングはわかりませんが、この作業も簡単です。この操作はDAOクラス内で実行されるため、PHPでもJAVAでも構いません。

于 2012-07-30T12:04:58.823 に答える
0

Bind with mysqli は、変数への参照で動作します。2番目の bind コマンドの最後の引数が、期待どおりに参照されているとは思いません。

最後の引数 $_POST['numQuestion'][$i] を変数に割り当て、この変数を bind メソッド呼び出しで使用します。これは定義されておらず、null に評価されており、null を文字列としてバインドできないか、参照として渡される変数を期待しているため、バインドが多次元配列を使用できないため、バインドが失敗していると推測しています。

これを試して:

//Below will set a default value of empty string if the POST variable is not set
$postVar = isset($_POST['numQuestion'][$i])?$_POST['numQuestion'][$i]:'';
$insertimagequestion->bind_param("sss", $lastID, $sessid, $postVar);

これを実行した後、QuestionId 列に '' が含まれるエントリが DB に表示される場合、$_POST['numQuestion'][$i] が設定されておらず、コードのどこかに問題があり、それとは関係ありません。 DB アクセス。

于 2012-08-02T02:22:51.413 に答える
0

2 回目の挿入が失敗した場合は、

if ($insertimagequestion->error) {
    // Handle query error here
   echo $insertimagequestion->error;
}

これにより、ステートメントの実行からスローされたエラーが何であるかがわかります。

PHP コードは問題ないようです。エラーは、外部キー制約または DB テーブルのその他の制約が原因である可能性があります。

PS:アップロードを許可するファイルの種類を検証して、人々が *.php または *.js ファイルをアップロードできないようにする必要があると思います。これは壊滅的な XSS 攻撃につながる可能性があります。また、ユーザーがアップロードしたものと同じファイル名を使用しないようにしてください。ランダム変数をプレフィックスとして付けることもできます。

//notice uniqid(time()) for randomness, also move the declaration of $img higher
//Assign the variable
$img = "ImageFiles/" . uniqid(time()) . $_FILES["fileImage"]["name"];
move_uploaded_file($_FILES["fileImage"]["tmp_name"], $img);
...
//Dont pass data directly to bind_param store it in a variable
$insert->bind_param("s", $img);
于 2012-08-02T00:41:01.980 に答える