单行更新(update)
更新时间:2024年8月30日 23:00
浏览:310
更新一个对象或数组到数据库
public function update(string $table, $object, $primaryKey = null): int
参数:
- string $table - 表名
- array | object $object - 要插入数据库的对象或数组,对象属性或数组锓名需要和该表字段一致
- null | string | array $primaryKey 主键或指定键名更新,未指定时自动取表的主键
返回值:
- int - 更新的行数,如果数据无变化,则返回0,更新失败时抛出异常
更新方法可以有效防止SQL注入,执行时先编译 SQL 横板,然后再通过占位符注入数据。
对象形式:
$obj = new \stdClass();
$obj->id = '92aee504-04d6-11ed-b416-0242ac180065';
$obj->name = '如花';
$obj->age = 18;
$obj->sex = '女';
$effectRows = Be::getDb()->update('user', $obj);
// 指定主键
// $effectRows = Be::getDb()->update('user', $obj, 'id');
将编译 SQL
UPDATE `user` SET `name`=?, `age`=?, `sex`=? WHERE id=?;
再注入一行数据
['如花', '18', '女', '92aee504-04d6-11ed-b416-0242ac180065']
注意:对象中所有字段,都将用于生成SQL语句。
数组形式:
$arr = [
'id' => '92aee504-04d6-11ed-b416-0242ac180065',
'name' => '如花',
'age' => 18,
'sex' => '女'
];
$db = Be::getDb();
$effectRows = $db->update('user', $arr);
按非主键更新
$obj = new \stdClass();
$obj->name = '如花';
$obj->age = 18;
$obj->sex = '女';
// 指定条件
$effectRows = Be::getDb()->update('user', $obj, ['name', 'sex']);
将编译 SQL
UPDATE `user` SET `age`=? WHERE `name`=? AND `sex`=?
再注入一行数据
[18, '如花', '女']
实际项目中通常从数据库中读取数据,再进行更新
// 数据对象
$db = Be::getDb();
// 指定ID
$id = '92aee504-04d6-11ed-b416-0242ac180065';
// 或从GET获取
// $id = Be::getRequest()->get('id');
$sql = 'SELECT id, name, age, sex FROM user WHERE id=?';
$obj = $db->getObject($sql, [$id]);
// $arr = $db->getArray($sql, [$id]); // 也可用数组形式
$obj->name = '如花';
$obj->age = 18;
$obj->sex = '女';
$effectRows = $db->update('user', $obj);