我正在研究Yii2
当我想将值更新为存在记录时,我发现了一些问题
这是我的更新代码
<?php
function UpdateValue($date_time,$svname,$tname,$path,$ttech){
$folder='C:\xampp_x\htdocs\yii-application\frontend\web\readtext\\'.$path.'\\';
$folder_dir=dir($folder);
$connection = Yii::$app->db;
while (($file = $folder_dir->read()) != false){
$posl=strpos($file,'-');
$posu=strpos($file,'_');
if ($posl=='' and $posu==''){
$name_ttech = 'app\models\\'.$ttech;
$model_update1 = $name_ttech::find()
->select('No')
->where(['FileName' => $file]);
if ($model_update1){
foreach($model_update1->all() as $value_num){
$num = $value_num->No;
include $folder.$file;
$command = $connection->createCommand(
'UPDATE '.$tname.' SET Value = '.$value.' WHERE No='.$num.',DateTimeBatch='.$date_time.',SeverName='.$svname);
$command->execute();
}
}
}
}
}
?>
错误
[1]:http://i.stack.imgur.com/DUFm2.png
谢谢
答案 0 :(得分:0)
问题在于您的SQL查询。你应该通过PDO使用绑定参数,而不仅仅是连接的SQL查询字符串。因为SQL查询中的连接值是最差的做法并导致SQL注入。
在您的错误中,您可以看到SQL查询中的$value
未被转义。
所以你的查询的例子应该是那样的
$db->createCommand('UPDATE {$tname} SET Value = :value
WHERE No=:num, DateTimeBatch=:datetime, SeverName=:server_name', [
':value' => $value,
':num' => $num,
':datetime' => $date_time,
':server_name' => $svname,
])->execute();
但是,你的代码中还有一些不明确的逻辑。您正在使用两个Models类来查找行,还使用QueryBuilder来更新它们。 你在其他文件中包含了一些奇怪的逻辑,但更好的是你可以在模型类或帮助器中包含这个逻辑(取决于你在该类中做了什么)。
答案 1 :(得分:0)
您应该学习如何使用参数绑定来避免这种错误和安全问题,例如:
$connection->createCommand('UPDATE '.$tname.' SET Value = :value WHERE No=:num, DateTimeBatch=:date_time, ServerName=:svname', [
':value' => $value,
':no' => $num,
':date_time' => $date_time,
':serverName' => $svname,
])->execute();
详细了解binding parameters in Yii2。
或者你可以简单地使用更新命令:
$connection->createCommand()->update($tname, ['Value' => $value], ['No'=>$num, 'DateTimeBatch'=>$date_time , 'serverName'=>$svname ])->execute();
详细了解Yii2 update command。