2

mysqli の準備済みステートメントを使用して、配列を mysql データベース テーブルに挿入したいと考えています。

bind-paramと 配列は一緒に使用できないことに注意して、最初に php でクエリを記述し、次にこれを準備済みステートメントとして処理します。

$tagQuery = "INSERT INTO word_tags(speaks) VALUES ";
// Count total array values
$icoderayInsideCount = count($icoderayInside);
foreach ($icoderayInside as $icoderayInsideKey=>$icoderayInsideValue)
{
    // Last value
    //  Currrent Array Key    Total / Last Array Value
    if ($icoderayInsideKey == $icoderayInsideCount)
    {
        $tagQuery .= "('$icoderayInsideValue')";
    }
    // All other values
    else
    {
        $tagQuery .= "('$icoderayInsideValue'), ";
    }           
}

// Send array (keywords) to database
if ($stmt2 = $link2->prepare($tagQuery))
{
    if (!$stmt2->execute())
    {
        // #2 If it can prepare but can't execute, why?
        echo "Error {$link2->errno}  :  {$link2->error} (Cant execute?) <br/>";
        // Dump query to check the end result
        var_dump($tagQuery);
        exit();
    }
    $stmt2->close();
}
else
{
    // #1 If it cant prepare, why?
    echo "Error {$link2->errno}  :  {$link2->error} (Cant prepare?)";
    exit();
}

これを PHP / サーバー経由で実行すると、次のようになります。

エラー 1064 : SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルで、1 行目の '('DONGLES')' 付近で使用する正しい構文を確認してください (準備できませんか?)

そのため、ステートメントは準備されていますが、実行されていません。

生成されたクエリの値$tagQueryは次のとおりです。

INSERT INTO word_tags(speaks) VALUES ('PMP3670B_BK'), ('PRESTIGIO'), ('MULTIPAD'), ('7"'), ('800X480'), ('1GHZ'), ('ARM'), ('CORTEX'), ('A8'), ('CPU'), ('512MB'), ('DDR3'), ('DRAM'), ('ANDROID'), ('4.1'), ('JELLY'), ('BEAN'), ('MALI'), ('400'), ('MP'), ('GPU'), ('VIDEO'), ('4GB'), ('INTERNAL'), ('FLASH'), ('MEMORY'), ('SUPPORT'), ('32GB'), ('SDHC/SD'), ('USB/WI-FI/HEADSET'), ('PORT'), ('LITHIUM'), ('POLYMER'), ('BLACK'), ('HDMI'), ('OUTPUT'), ('UPTO'), ('1080'), ('HD'), ('USB2.0'), ('MINI'), ('HIGH'), ('SPEED'), ('FOR'), ('3G'), ('DONGLE'), ('OTG'), ('CABLE'), ('INCLUDED')

最後から 4 番目の値は('DONGLE')、エラー メッセージの内容です。

このまったく同じクエリを phpmyadmin で実行すると、エラーは発生しません。

私が想定しているのは、準備されたステートメントの作成に何らかの長さの制限があるということです...または、この効果に何か。

これを解決しようと何時間も頭を悩ませましたが、関連する情報は見つかりませんでした.

問題の矛盾がこれに含まれる可能性があることについて、誰かが支援/アドバイス/指摘/入力、またはその他の方法で提供できる場合は、大いに感謝します.

これを準備するのに時間と労力を費やしてくれてありがとう!

編集:

@Mihai - 考えてくれてありがとう。

ドングルという言葉には何か文字列が含まれているようです。配列に解析される前の元の文字列は、次のようになります。DONGLE,

preg_replace を実行して、配列に解析する前に文字列からこのコンマを削除します。

$icode = preg_replace('#,#', '', $icode);

次に、配列に:

$icoderayInside = explode(" ", $icode);

これが出力文字列として競合を引き起こす理由はまだ考えられません。クエリは以前に述べたとおりであり、コンマなどは含まれていません...どれでも大歓迎です!

編集2:

@ShadyAtef

元の入力は、varchar、latin_general_ci として mysql に保存されます。

PRESTIGIO MULTIPAD, 7" 800X480, 1GHZ ARM CORTEX A8 CPU, 512MB DDR3 DRAM, ANDROID 4.1 JELLY BEAN, MALI 400 MP GPU, VIDEO, 4GB INTERNAL FLASH MEMORY, SUPPORT 32GB SDHC/SD, USB/WI-FI/HEADSET PORT, LITHIUM POLYMER, BLACK, HDMI OUTPUT UPTO 1080 HD, USB2.0 MINI HIGH SPEED PORT FOR 3G DONGLE, OTG CABLE INCLUDED

php に取り込まれ、追加の要件で配列に処理されます。

// Convert Var a + b to String      
$icode = $itemCode . ' ' . $description;  
// Clean of Unwanteds
$icode = preg_replace('#,#', '', $icode);
$icode = preg_replace('#\(#', '', $icode);
$icode = preg_replace('#\)#', '', $icode);
// Creates array from sting
$icoderayInside = explode(" ", $icode);
// Remove array duplicates
$icoderayInside = array_unique($icoderayInside);

クエリに組み込まれる前。どんな支援も大歓迎です!

編集3:

@ShadyAtef

//  Currrent Array Key    Total / Last Array Value
if ($icoderayInsideKey == $icoderayInsideCount)
{
    // dump here shows:
    $icoderayInsideKey == 49
    $icoderayInsideCount == 49
}
4

1 に答える 1