PDOが間違った値を挿入してMySqlにこの準備された挿入が行われるのはなぜですか?

アンドリューシーブルック

jpgマップの各ポイントを反映するマップポイントを使用してデータベーステーブルをシードしようとしています。コードは小さな3x7画像を使用したテストですが、アプリケーションははるかに大きなマップを対象としており、マップポイント情報が各ポイントに関連付けられてテーブルに保存されます。map_terrainフィールドは、特定の座標の色の16進値を表します。しかし、うまくいかないのは関連するx、y値です。

最終的に、テーブルの各行はmap_point_x = 7およびmap_point_y = 3になります。map_terrainフィールドには正しい値があります。

これはどのように迷っていますか?

$image_filespec = '../test.jpg';
$map_id = 1;

include_once '../includes/functions.php';

function heximagecolorat($image, $x, $y, $sharp_prefix = TRUE) {

        $rgb = imagecolorat($image, $x, $y);

        $r = ($rgb >> 16) & 0xFF;
        $g = ($rgb >> 8) & 0xFF;
        $b = $rgb & 0xFF;

   If ($sharp_prefix == TRUE) {
       $hex = "#";
   } else {
       $hex = "";
   }
   $hex .= str_pad(dechex($r), 2, "0", STR_PAD_LEFT);
   $hex .= str_pad(dechex($g), 2, "0", STR_PAD_LEFT);
   $hex .= str_pad(dechex($b), 2, "0", STR_PAD_LEFT);

   return $hex; // returns the hex value including the number sign (#)
}


if ($image_filespec == 'nnn.jpg' ){
    echo 'you need to edit teh php file to make this work and alter $image_filespec as appropriate';
    return;
}


//$result = query_db('SELECT * FROM users');
//  
//while($row = $result->fetch()){
//    echo $row['uID'] . " - " . $row['uUsername'] . "<br/>";
//}

$image = imagecreatefromjpeg($image_filespec); // imagecreatefromjpeg/png/

$width = imagesx($image);
$height = imagesy($image);
$colors = array();


for ($y = 0; $y < $height; $y++) {

    for ($x = 0; $x < $width; $x++) {

        $colors[] = heximagecolorat($image, $x, $y, $sharp_prefix=FALSE) ; 
    } 
}

// connect and insert arrya to database $row in this context is talking about table row as opposed to row from the original image
$dbh = db_connect();

$query = "INSERT INTO map_points (  map_id, map_point_x, map_point_y, map_terrain ) VALUES "; //Prequery
$qPart = array_fill(0, count($colors), "( ?, ?, ?, ?)");
$query .=  implode(",",$qPart);
$stmt = $dbh -> prepare($query); 
$i = 1;

$point=0;
for ($y = 0; $y < $height; $y++) {
    for ($x = 0; $x < $width; $x++) { //bind the values one by one
        $stmt -> bindParam($i++, $map_id);
        $stmt -> bindParam($i++, $x);
        $stmt -> bindParam($i++, $y);
        $stmt -> bindParam($i++, $colors[$point]);
        $point += 1;
    }
}
$temp=$stmt;
$stmt -> execute(); //execute
トーマスクリーマーズ

私はこの問題は、の使用であると信じてPDOStatement::bindParam()、このバインド変数の値(のような:$x$y、...)クエリ実行の瞬間にこれはすなわち、ループ後の最終的な値になります3し、7あなたの例では。

PDOStatement::bindValue()代わりに使用してください

さらに、行の数と同じ数のタプルを使用する代わりに、ポイントごとにステートメントを実行すると、コードの読み取りと保守がより簡単になる場合があります。つまり、INSERT INTO map_points(map_id, map_point_x, map_point_y, map_terrain) VALUES (?, ?, ?, ?)1つではなく複数使用しますINSERT INTO map_points(map_id, map_point_x, map_point_y, map_terrain) VALUES (?, ?, ?, ?), (?, ?, ?, ?), ...複数のタプルの方がパフォーマンスは優れていますが、INSERTステートメントをトランザクションでラップすることで同様のパフォーマンスを実現できます。

$dbh = db_connect();

$stmt = $dbh->prepare('INSERT INTO map_points (map_id, map_point_x, map_point_y, map_terrain) VALUES (?, ?, ?, ?)');
$y = 0;
$x = 0;
$stmt->bindValue(1, $map_id);
$stmt->bindParam(2, $x);
$stmt->bindParam(3, $y);
$dbh->beginTransaction();
for (; $y < $height; $y++) {
    for (; $x < $width; $x++) {
        $stmt->bindValue(4, heximagecolorat($image, $x, $y, $sharp_prefix=FALSE));
        $stmt->execute();
    }
}
$dbh->commit();

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

挿入点を使用した二分探索-挿入点が間違っているのはなぜですか?

分類Dev

このPDO挿入が2回実行されるのはなぜですか?

分類Dev

PHPによって挿入されたdivが重複しているのはなぜですか?

分類Dev

C ++ 11でunordered_mapが挿入したものを破棄することは、C ++標準委員会によって意図されていますか?

分類Dev

PHP PDO OOP:MySQLに送信/挿入される値が1つだけなのはなぜですか?

分類Dev

Javaを介してspが呼び出されているときに間違った値を挿入する

分類Dev

このコードが書き込まれた2つの行の間に空白行を挿入するのはなぜですか(C#Excel相互運用)?

分類Dev

他のメンバーが新しい値に設定されると、Cユニオンメンバーは特定の/間違った値を与えます。Cの次のコードでこの出力が行われるのはなぜですか?

分類Dev

このコードでキュー機能を表示して、最初に挿入された値のみを数回出力するのはなぜですか?

分類Dev

なぜangularは$ sce.trustAsHtmlによって挿入された入力のngモデルの値を取得しないのですか?

分類Dev

MYSQL挿入されたすべての値が表示されているわけではありません

分類Dev

追加された最初の行にタブが挿入されないのはなぜですか?

分類Dev

Windows 7で挿入されたCDまたはDVDのdesktop.iniが「ディスクに書き込む準備ができている」のはなぜですか?

分類Dev

要素がすでにセットに含まれているのに、IndexSetが新しい要素が挿入されたと言うのはなぜですか?

分類Dev

挿入が実際に成功した場合でも、postgresへの挿入後にErrNoRows( "sql:no rows in result set")が返されるのはなぜですか?

分類Dev

間違った位置に挿入します-なぜluaテーブルがこのように動作するのですか?

分類Dev

割り込みは、出力の準備ができているか、入力が完了したことを示すために使用されていますか?

分類Dev

容量 (キャップ) が 0 の場合、このトリガーは新しく挿入されたタプルを削除する必要があります。私はここで何を間違えたのですか?ここにコードがあります

分類Dev

これらのprint()呼び出しが間違った順序で実行されているように見えるのはなぜですか?

分類Dev

与えられた入力が間違っていると、vbaが常にエラーなしを返すのはなぜですか?

分類Dev

ident_currentは、最後に挿入されたIDが間違っていることを示しています

分類Dev

実行によって間違った出力が表示されるのはなぜですか?

分類Dev

PHPとMySQLの挿入は成功しましたが、行がPHPMyAdminに挿入されたことを確認できません

分類Dev

この合成関数が参照として渡されたときに、関数を間違った順序で適用するのはなぜですか?

分類Dev

このコードでは、他の値で正常に機能しているのに、入力値4.2でのみ間違った出力が得られるのはなぜですか?

分類Dev

挿入によってリストがNoneタイプに変更されるのはなぜですか?

分類Dev

jOOQモッキング:挿入すると、後続の選択のためにMockResultを準備する必要があるのはなぜですか?

分類Dev

入力されたパスワードが間違っていることをubuntuが理解するのに長い時間がかかるのはなぜですか?

分類Dev

BinarySearchTree実装が、挿入された要素を常に重複として報告するのはなぜですか?

Related 関連記事

  1. 1

    挿入点を使用した二分探索-挿入点が間違っているのはなぜですか?

  2. 2

    このPDO挿入が2回実行されるのはなぜですか?

  3. 3

    PHPによって挿入されたdivが重複しているのはなぜですか?

  4. 4

    C ++ 11でunordered_mapが挿入したものを破棄することは、C ++標準委員会によって意図されていますか?

  5. 5

    PHP PDO OOP:MySQLに送信/挿入される値が1つだけなのはなぜですか?

  6. 6

    Javaを介してspが呼び出されているときに間違った値を挿入する

  7. 7

    このコードが書き込まれた2つの行の間に空白行を挿入するのはなぜですか(C#Excel相互運用)?

  8. 8

    他のメンバーが新しい値に設定されると、Cユニオンメンバーは特定の/間違った値を与えます。Cの次のコードでこの出力が行われるのはなぜですか?

  9. 9

    このコードでキュー機能を表示して、最初に挿入された値のみを数回出力するのはなぜですか?

  10. 10

    なぜangularは$ sce.trustAsHtmlによって挿入された入力のngモデルの値を取得しないのですか?

  11. 11

    MYSQL挿入されたすべての値が表示されているわけではありません

  12. 12

    追加された最初の行にタブが挿入されないのはなぜですか?

  13. 13

    Windows 7で挿入されたCDまたはDVDのdesktop.iniが「ディスクに書き込む準備ができている」のはなぜですか?

  14. 14

    要素がすでにセットに含まれているのに、IndexSetが新しい要素が挿入されたと言うのはなぜですか?

  15. 15

    挿入が実際に成功した場合でも、postgresへの挿入後にErrNoRows( "sql:no rows in result set")が返されるのはなぜですか?

  16. 16

    間違った位置に挿入します-なぜluaテーブルがこのように動作するのですか?

  17. 17

    割り込みは、出力の準備ができているか、入力が完了したことを示すために使用されていますか?

  18. 18

    容量 (キャップ) が 0 の場合、このトリガーは新しく挿入されたタプルを削除する必要があります。私はここで何を間違えたのですか?ここにコードがあります

  19. 19

    これらのprint()呼び出しが間違った順序で実行されているように見えるのはなぜですか?

  20. 20

    与えられた入力が間違っていると、vbaが常にエラーなしを返すのはなぜですか?

  21. 21

    ident_currentは、最後に挿入されたIDが間違っていることを示しています

  22. 22

    実行によって間違った出力が表示されるのはなぜですか?

  23. 23

    PHPとMySQLの挿入は成功しましたが、行がPHPMyAdminに挿入されたことを確認できません

  24. 24

    この合成関数が参照として渡されたときに、関数を間違った順序で適用するのはなぜですか?

  25. 25

    このコードでは、他の値で正常に機能しているのに、入力値4.2でのみ間違った出力が得られるのはなぜですか?

  26. 26

    挿入によってリストがNoneタイプに変更されるのはなぜですか?

  27. 27

    jOOQモッキング:挿入すると、後続の選択のためにMockResultを準備する必要があるのはなぜですか?

  28. 28

    入力されたパスワードが間違っていることをubuntuが理解するのに長い時間がかかるのはなぜですか?

  29. 29

    BinarySearchTree実装が、挿入された要素を常に重複として報告するのはなぜですか?

ホットタグ

アーカイブ