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 / Server 运行它时,我得到:

错误 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')

最后的第四个值是('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

1

这真的很棘手,但我明白了:棘手的错误部分是

    if ($icoderayInsideKey == $icoderayInsideCount)

它应该是

        if ($icoderayInsideKey == ($icoderayInsideCount-1))

因为数组中的最后一个键等于数组(长度-1)所以你应该改变你的if条件

于 2013-09-08T09:16:49.683 回答