这里是我的代码 -
$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 ??
中答案 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
你可以做的最少意味着有一个更好的解决方案。好吧有。
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注入攻击。