无法在longtext字段中保存序列化数组

时间:2015-05-28 18:49:18

标签: php mysql arrays serialization

我正在尝试将序列化数组保存到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就行了。关于什么错误的想法?

1 个答案:

答案 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 文档,以便了解可用的方法。