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().(但是,直到现在,我没有意识到这个错误.)
这个问题已经很老了,但我觉得是时候来点死灵法了。通过@jensgram接受的答案是没有错,但说mysql_real_escape_string是最少的,你可以做意味着有一个更好的解决方案。那么有。
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 注入的可能性。