无法在长文本字段中保存序列化数组
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 文档,这样您就知道可以使用哪些方法。
我正在尝试将序列化数组保存到 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 文档,这样您就知道可以使用哪些方法。