Yii2,无法将信件更新到数据库中

时间:2016-05-02 02:58:13

标签: php sql-server sql-server-2008 yii2

我正在研究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

  • 我使用的是SQL Server 2008

谢谢

2 个答案:

答案 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

相关问题