我正在尝试将序列化数组保存到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就行了。关于什么错误的想法?
答案 0 :(得分:1)
首先,序列化数据将留有引号和特殊字符,因此您可能会以您的方式生成无效查询。您确实需要使用预备语句来确保您有有效的查询。更不用说你最终会遇到各种令人讨厌的SQL注入攻击 - 只需使用准备好的语句。
http://php.net/manual/en/mysqli.quickstart.prepared-statements.php
其次,在数据库中存储序列化数据通常是一种非常糟糕的做法,因为数据不再是可移植的。您有一个具有各种数据类型的关系数据库 - 使用它们!
要强调不使用预准备语句所带来的风险,请考虑要序列化的数组是否如下所示:
SELECT Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END) AS 'Windows-SEP-11',
Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END) AS 'Windows-SEP-12',
Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END) AS 'Mac-SEP-11',
Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END) AS 'Mac-SEP-12'
FROM dbo.sem_computer
INNER JOIN [dbo].[V_SEM_COMPUTER]
ON [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN dbo.SEM_AGENT
ON SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
INNER JOIN dbo.SEM_CLIENT
ON dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN dbo.IDENTITY_MAP
ON dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
INNER JOIN dbo.PATTERN
ON dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
WHERE Name LIKE '%Staten Island%'
猜猜会发生什么......
更新帮助: 以下是使用预准备语句编写查询的方法 - 您需要确保验证每个步骤以捕获和处理错误。
第1步:编写查询 - “?”是你将绑定参数的地方
$resultArray = array("';DROP TABLE mytable;##");
第2步:创建准备好的声明
$query = "UPDATE mytable.exp_cartthrob_item_options_options SET data = ? WHERE id = '1'";
第3步:绑定您的参数(查询中的“?”)
$stmt = $con->prepare( $query );
第4步:执行查询
$stmt->bind_param( "s" , $serializeArray );
理想情况下,您应该阅读整个 mysqli 文档,以便了解可用的方法。