如何知道MySQL何时需要转义

Len*_*ood 6 php mysql escaping

我正在使用CodeIgniter构建一个站点.这是我自己构建的第一个与数据库交互的站点.我在这个项目中使用MySQL.如何在将数据保存到数据库之前判断数据是否需要转义?

Dec*_*ler 8

我建议你习惯使用准备好的陈述.特别是因为您不熟悉数据库.越早开始使用这些,就越容易成为第二天性.

例如,当我开始使用数据库时,我不知道准备好的语句.当我与他们联系时,我经历了自己的僵局.因为我已经习惯了另一种做事方式.现在,这可能不是你自己的角色交易,但无论如何都要尽快开始.

准备好的语句允许您在查询中使用占位符.然后,可以通过将这些占位符绑定到占位符来将这些占位符替换为实际值.这个绑定过程会自动转义值.

这是一个(简单的)PDO示例:

$db = new PDO( /* some database parameters */ );
$statement = $db->prepare( 'INSERT INTO table VALUES( :username, :password )' );
$statement->bindValue( ':username', $dirtyUsername );
$statement->bindValue( ':password', $dirtyPassword );
$result = $statement->execute();
// result checking ommited for brevity
Run Code Online (Sandbox Code Playgroud)

PDO和准备好的陈述有很多可能性.例如,您可以轻松地在循环中重用预准备语句,如下所示:

$statement = $db->prepare( 'INSERT INTO table VALUES( :username, :password )' );
foreach( $users as $dirtyUser )
{
    $statement->bindValue( ':username', $dirtyUser->username );
    $statement->bindValue( ':password', $dirtyUser->password );
    $result = $statement->execute();
    // result checking ommited for brevity
}
Run Code Online (Sandbox Code Playgroud)

或者将占位符绑定传递给execute方法,如下所示:

$statement = $db->prepare( 'INSERT INTO table VALUES( :username, :password )' );
$result = $statement->execute( array( 
                                   ':username' => $dirtyUsername, 
                                   ':password' => $dirtyPassword
                             ) );
// result checking ommited for brevity
Run Code Online (Sandbox Code Playgroud)

......等等


Dan*_*oof 3

如果您将数据库类查询绑定一起使用,则无需执行任何手动转义:

使用绑定的第二个好处是值会自动转义,从而产生更安全的查询。您不必记住手动转义数据;引擎会自动为您完成此操作。