Php MySQLi准备使用fetch\u assoc,还是mysql\u real\u escape\u字符串可以使用?
我继承了一个中等规模的代码库,它广泛使用mysql\u fetch\u assoc和mysql\u fetch\u对象,并且没有任何防止SQL注入的安全预防措施。我认为这是一件非常糟糕的事情,需要修复 最初,我打算使用mysqli prepare/bind_param/execute语句来处理数据库查询。但是,以下情况不起作用:Php MySQLi准备使用fetch\u assoc,还是mysql\u real\u escape\u字符串可以使用?,php,pdo,mysqli,Php,Pdo,Mysqli,我继承了一个中等规模的代码库,它广泛使用mysql\u fetch\u assoc和mysql\u fetch\u对象,并且没有任何防止SQL注入的安全预防措施。我认为这是一件非常糟糕的事情,需要修复 最初,我打算使用mysqli prepare/bind_param/execute语句来处理数据库查询。但是,以下情况不起作用: $stmt = $GLOBALS['db']->prepare('SELECT * FROM Users WHERE Username=?'); $stmt-&g
$stmt = $GLOBALS['db']->prepare('SELECT * FROM Users WHERE Username=?');
$stmt->bind_param('s', $username);
$stmt->execute();
// Somehow retrieve the fetched row as an object (Doesn't work!)
return $stmt->fetch_assoc();
问题1:是否有一种方法可以使用fetch\u assoc或使用prepare/bind获取\u对象?我可以重构所有的代码,但这将是混乱的,需要很长时间
问题2:如果不可能做到这一点,那么从安全角度来看,使用mysqli_query()是否同样有效,前提是所有输入都通过mysql_real_escape_string()正确转义?你还有其他建议吗
$row=$stmt->fetch(PDO::fetch\u ASSOC)
Ref:用原始mysli替换原始mysql毫无意义。
事实上,所有那些可怜的重复的prepare/bind/execute/fetch和mysql\u query/fetch一样丑陋 如果你要重构你的代码,你必须开发一些库函数,它将把一个查询和它的参数作为参数,并返回一个数据数组,在里面进行所有的获取 至于通过mysql_real_escape_string()转义所有输入,这将是一种等效于魔术引号的做法,这最终被认为是一种不好的做法
事实上,mysql\u real\u escape\u string()并不能保证任何数据的安全。这与安全毫无关系。这只是一个格式化例程,只适用于字符串。但在查询中还可以插入其他类型。关于详细的解释,请参考我前面的答案,看起来这样做,我必须使用PDO而不是mysqli,但我认为这应该可以。mysqli有
$result=$stmt->get_result()
,它应该会返回一个常规的结果集,您可以在上面执行一段时间(fetchrow())类型的操作,但我从未使用过它,所以我不确定这是否正是你想要的