无法在长文本字段中保存序列化数组

Can't save serialized array in longtext field

我正在尝试将序列化数组保存到 LONGTEXT 字段,但由于某种原因数据没有保存,我没有收到错误。

    $serializeArray = serialize($result_arr) ; 
    echo "Serialized String: " . $serializeArray ."<br><br>";

    $test2 = "This is a test" ;

    $return = mysqli_query($con,"UPDATE mytable.exp_cartthrob_item_options_options SET data = '" . $serializeArray ."' WHERE id = '1' " );

    echo "<br /><br />" ;
    echo $return ;

如果我用 $test 替换 $serializeArray,它工作正常。有什么问题吗?

首先,序列化数据会留下引号和特殊字符,因此您很可能会按照自己的方式生成无效查询。您确实需要使用 准备好的语句 来确保您的查询有效。更不用说您最终可能会遇到各种讨厌的 SQL 注入攻击 - 只需使用准备好的语句即可。

http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

其次,将序列化数据存储在数据库中通常是一种非常糟糕的做法,因为数据不再是可移植的。您有一个包含各种数据类型的关系数据库 - 使用它们!

为了突出不使用准备好的语句带来的风险,请考虑要序列化的数组是否如下所示:

$resultArray = array("';DROP TABLE mytable;##");

猜猜会发生什么...

更新求助: 以下是如何使用准备好的语句编写查询 - 您需要确保验证每个步骤以捕获和处理错误。

第 1 步:编写您的查询 - “?”是您绑定参数的地方

$query = "UPDATE mytable.exp_cartthrob_item_options_options SET data = ? WHERE id = '1'";

第 2 步:创建准备好的语句

$stmt = $con->prepare( $query );

第 3 步:绑定您的参数(查询中的“?”)

$stmt->bind_param( "s" , $serializeArray );

第 4 步:执行查询

$stmt->execute();

最好通读整个 mysqli 文档,这样您就知道可以使用哪些方法。