作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将序列化数组保存到 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 注入(inject)攻击 - 只需使用准备好的语句即可。
http://php.net/manual/en/mysqli.quickstart.prepared-statements.php
其次,将序列化数据存储在数据库中通常是一种非常糟糕的做法,因为数据不再可移植。您有一个具有各种数据类型的关系数据库 - 使用它们!
为了强调不使用准备好的语句所带来的风险,请考虑要序列化的数组是否如下所示:
$resultArray = array("';DROP TABLE mytable;##");
猜猜会发生什么......
更新帮助:以下是使用准备好的语句编写查询的方法 - 您需要确保验证每个步骤以捕获和处理错误。
第 1 步:写下您的查询 - “?”是您绑定(bind)参数的地方
$query = "UPDATE mytable.exp_cartthrob_item_options_options SET data = ? WHERE id = '1'";
第 2 步:创建准备好的语句
$stmt = $con->prepare( $query );
第3步:绑定(bind)参数(查询中的“?”)
$stmt->bind_param( "s" , $serializeArray );
第 4 步:执行查询
$stmt->execute();
您最好通读整个 mysqli 文档,以便了解哪些方法可供您使用。
关于php - 无法在长文本字段中保存序列化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30514811/
我是一名优秀的程序员,十分优秀!