これら 2 つのコードの断片が yii で安全かどうか教えてください。フラグメント 1:
$numberOfRows = $this->updateAll(array('full_path' => $target, 'title' => $name, 'machine_name' => $name), 'full_path = :path', array(':path' => $path));
このクエリで $target と $name をエスケープする必要がありますか?
フラグメント 2:
$sql = "UPDATE folders";
$sql .= " SET full_path = CONCAT('" . $target . "',SUBSTR(full_path, " . (strlen($path) + 1) . ", LENGTH(full_path)-1))";
$sql .= " WHERE full_path LIKE '" . $path . "%'";
$command = $this->dbConnection->createCommand($sql);
$command->execute();
ここで、CDbConnection::quoteValue() を使用して $target と full_path をエスケープするか、これら 2 つのフラグメントでこのようなものを使用する必要がありますか? また、Fragment 2 でパスをエスケープして、LIKE (%, _) で使用される特殊記号の問題を回避する方法も 1 つ説明します。
バインドとエスケープ %_ を使用してフラグメント 2 に変更を加えました。
$sql = "UPDATE folders";
$sql .= " SET full_path = CONCAT(:target, SUBSTR(full_path, " . (strlen($path) + 1) . ", LENGTH(full_path)-1))";
$sql .= " WHERE full_path LIKE :pathFilter";
$command = $this->dbConnection->createCommand($sql);
//escape %_ that can be used in SQL LIKE expression
$pathFilter = addcslashes($path, '%_') . '%';
$command->bindParam(":pathFilter", $pathFilter, PDO::PARAM_STR);
$command->bindParam(":target", $target, PDO::PARAM_STR);
$command->execute();
それが正しいか?それを行うよりエレガントな方法はありますか?