如何将序列化数据插入数据库?

时间:2010-11-15 09:59:39

标签: php mysql serialization

这里是我的代码 -

$things = serialize($_POST['things']);
echo $things;

require 'database.php';

$q = "INSERT INTO tblslider(src) values($things)";
mysql_query($q, $link);

if($result)
{
echo "Slider saved successfully.";
}

输出 -
a:4:{i:0;s:10:"651603.jpg";i:1;s:11:"7184512.jpg";i:2;s:11:"3659637.jpg";i:3;s:10:"569839.jpg";}v

这意味着我正确地获取了记录,但为什么它没有保存在db ??

5 个答案:

答案 0 :(得分:13)

您忘记了$things周围的引语:

$q = "INSERT INTO tblslider(src) values('" . mysql_real_escape_string($things) . "')";

mysql_real_escape_string()实际上是您曾经做的至少

同样作为@sanders mentions,您应该始终输出完整的查询(通过print_r()var_dump())作为调试的第一步。


我更喜欢构建这样的查询以增强可读性:

$q = sprintf(
         'INSERT INTO tblslider(src) VALUES ("%s")',
         mysql_real_escape_string($things)
     );

也就是说,每当我完全拥有来构建并自己逃避它们时。你应该看看PDO


修改
该帖子中的评论表明OP实际上想要将651603.jpg,7184512.jpg,3659637.jpg,569839.jpg插入数据库。在这种情况下,implode()可以是used(前提是只有$_POST['things'] 包含要插入的项目!):

$q = sprintf(
         'INSERT INTO tblslider(src) VALUES ("%s")',
         mysql_real_escape_string(implode(',', $_POST['things']))
     );

注意,我在这里直接使用$_POST['things']。没有serialize()。 (但是,直到现在我才意识到这个错误。)

答案 1 :(得分:4)

这个问题已经很老了,但我觉得是时候进行一点点的死灵法术了。 @jensgram接受的答案并没有错,但是说mysql_real_escape_string 你可以做的最少意味着有一个更好的解决方案。好吧有。

PHP数据对象

PDOs。这些坏男孩为您的数据库访问提供了一个抽象层,因此它可以与许多其他数据库(不仅仅是MySQL)一起使用,并且可以在同一个查询多次运行时提高性能。坚果这不是你需要它们的原因。

安全

逃避的东西很难。要么在特定的环境中如何做到这一点,要么你只是忘记这样做。最糟糕的是,你不会因为遗忘而得到任何错误,只是继续前进,就像什么也没发生一样。而你刚刚为令人遗憾的国家互联网安全做出了贡献。

正确使用PDO(例如,没有字符串连接)但是确保在构建数据库查询时不会弄乱正确的转义。

您需要阅读:(The only proper) PDO tutorial

基本上你可以在替换其中的任何参数之前准备一个sql语句。 SQL语法将被修复,不能被错误/不转义或恶意伪造的请求破坏。

那么如何做到这一点

首先,您需要一个连接,就像常规的mysql驱动程序一样。

$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new PDO($dsn, $user, $pass, $opt);

如您所见,有设置,错误模式,提取模式。值得一读的是每个设置的功能,但现在只需保留它。最后,你可以使用$ pdo变量。

$query = "INSERT INTO tblslider(src) VALUES (?)";
$stmt = $pdo->prepare($query); 

此时我们得到了陈述。什么都没有来自外部资源,它是一个INSERT声明。

$things = serialize($_POST['things'])
$stmt->execute([ $things ]); //execute

还有其他方法可以将?-s绑定到参数,为了清晰起见,您也可以使用命名参数,但这就足够了。

就是这样:没有花哨的逃避,但也没有SQL注入的可能性。

答案 2 :(得分:2)

通常,我会序列化然后使用base64_encode来消除意外并“标准化”输入。例如:

$things = base64_encode(serialize($_POST['things']));
$insert_query = "INSERT INTO...";

然后,当你想抓住它时,只需颠倒过程即可。

$query_result = mysql_query("SELECT FROM ...");
$row = mysql_fetch_assoc($query_result);
$retrieved_value = unserialize(base64_decode($row['src']);

答案 3 :(得分:0)

var_dump($q)之前放置mysql_query(...) 然后,您可以检查您的查询。

答案 4 :(得分:0)

您正在为数据库写一个字符串,所以不要忘记在查询中添加引号:

$q = "INSERT INTO tblslider(src) values('$things')";

还要确保过滤字符串以避免SQL注入攻击。