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

ppp*_*ppp 1 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.";
}
Run Code Online (Sandbox Code Playgroud)

输出 -
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中保存?

jen*_*ram 13

你忘记了周围的报价$things:

$q = "INSERT INTO tblslider(src) values('" . mysql_real_escape_string($things) . "')";
Run Code Online (Sandbox Code Playgroud)

mysql_real_escape_string()是真正的至少你应该永远做!

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


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

$q = sprintf(
         'INSERT INTO tblslider(src) VALUES ("%s")',
         mysql_real_escape_string($things)
     );
Run Code Online (Sandbox Code Playgroud)

也就是说,每当我必须自己构建和逃避它们时.你应该看看PDO.


编辑
此线程中的注释表明OP实际上想要插入651603.jpg,7184512.jpg,3659637.jpg,569839.jpg数据库.在这种情况下implode()可以使用(假设$_POST['things'] 包含要插入的项目!):

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

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


Soo*_*ead 5

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

PHP 数据对象

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

安全

逃避东西是很困难的。要么在特定的上下文中不清楚如何去做,要么你只是忘记了去做。最糟糕的是,您不会因为忘记它而出错,而是像什么也没发生一样继续前进。而你只是为令人遗憾的互联网安全状况做出了贡献。

正确使用 PDO(例如没有字符串连接)将确保您不会在构建数据库查询时正确地转义内容。

您将需要阅读以下内容:(唯一正确的)PDO 教程

基本上,您可以在替换其中的任何参数之前准备一个 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);
Run Code Online (Sandbox Code Playgroud)

如您所见,有设置、错误模式、获取模式。值得阅读每个设置的作用,但现在就让它保持原样。最后,您可以使用 $pdo 变量。

$query = "INSERT INTO tblslider(src) VALUES (?)";
$stmt = $pdo->prepare($query); 
Run Code Online (Sandbox Code Playgroud)

此时我们得到了我们的声明。还没有来自外部来源,它是一个 INSERT 语句。

$things = serialize($_POST['things'])
$stmt->execute([ $things ]); //execute
Run Code Online (Sandbox Code Playgroud)

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

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