PHP批量执行MySql语句

PHP无法批量执行MySql的sql语句
查找了不少的资料,发现mysqli_query()方法不支持某些mysql语句的批量执行,所以妥协了,毕竟目前学习mysql不是我的主要目的,能用就行。最后用数组循环执行实现。

<?php
header("Content-Type: text/html;charset=gbk");
require_once'F:\html\phpstudy\login.php';
$conn=new mysqli($db_hostname,$db_username,$db_password,$db_database);//创建数据库连接数据,打开数据库
if($conn->connect_error) {die($conn->connect_error);}
else echo "连接数据库成功---";
//设定字符集
mysqli_set_charset($conn,'gbk');
$createsql=array('create database STU','use STU','create table student(id char(10) not null,name char(20),sex char(10),age int,photo varchar(50))');
$end="";
for($i=0;$i<3;$i++)
{
$end=mysqli_query($conn,$createsql[$i]);
if(!$end)
{
    echo "创建失败:".$conn->error;
    break;
}
}
if($end)
{
echo "创建成功";
}
mysqli_close($conn);
?>
<think>嗯,用户想让我介绍一下如何用PHPMySQL写一个根据主键进行批量更新的语句。首先,我需要回忆一下MySQL批量更新的方法。记得MySQL支持使用CASE语句来实现多行的条件更新,这样可以一次性更新多条记录,而不是用多个单独的UPDATE语句,这样效率更高。 接下来,我需要考虑如何构造这样的SQL语句。主键通常是唯一的,所以每个主键对应一条记录。假设用户有一个表,比如叫users,主键是id,想要根据不同的id更新不同的name和email字段。那么SQL语句的大致结构应该是: UPDATE 表名 SET column1 = CASE id WHEN 主键值1 THEN 新值1 WHEN 主键值2 THEN 新值2 ... END, column2 = CASE id WHEN 主键值1 THEN 新值1 WHEN 主键值2 THEN 新值2 ... END WHERE id IN (主键值1, 主键值2, ...); 这样,每条记录的各个字段会根据对应的id进行更新。然后,用户需要在PHP中动态生成这个SQL语句。这时候需要注意防止SQL注入,所以最好使用参数化查询或者预处理语句。不过,由于CASE语句中的值需要动态拼接,预处理可能不太方便,所以可能需要转义用户输入的数据,或者确保数据来自可信来源。 举个例子,如果用户有一个数组$data,每个元素包含id、name和email,那么需要遍历这个数组,收集所有的主键值,构建每个字段的CASE部分。然后,拼接成完整的SQL语句,并执行。 需要注意的是,如果更新的数据量很大,这样的SQL语句可能会很长,超过MySQL的限制,所以要分批次处理,比如每次处理100条。另外,确保WHERE子句中的主键列表正确,避免更新不需要的记录。 还有,事务处理也是一个考虑点,如果需要保证所有更新都成功,可以开启事务,执行所有更新后提交,如果中间出错则回滚。 然后,用户可能关心如何防止SQL注入,所以在处理用户输入的数据时,必须进行适当的过滤和转义,比如使用mysqli_real_escape_string或者PDO的quote方法。或者,如果可能的话,使用预处理语句,但预处理在动态CASE语句中可能不太容易实现,所以需要权衡。 最后,给出一个完整的示例代码,展示如何从数组生成SQL语句执行更新,并处理可能的错误。同时提醒用户注意数据安全和性能问题,比如分批处理和使用事务。</think>在PHP中实现MySQL根据主键批量更新,通常采用`CASE WHEN`语句动态构建条件。以下是详细实现步骤及示例: $$UPDATE\ users\\ SET\\ name = CASE\ id\\ WHEN\ 1\ THEN\ '张三'\\ WHEN\ 2\ THEN\ '李四'\\ WHEN\ 3\ THEN\ '王五'\\ END,\\ email = CASE\ id\\ WHEN\ 1\ THEN\ 'zhangsan@example.com'\\ WHEN\ 2\ THEN\ 'lisi@example.com'\\ WHEN\ 3\ THEN\ 'wangwu@example.com'\\ END\\ WHERE\ id\ IN\ (1,2,3)$$ **PHP实现代码:** ```php <?php // 示例数据(建议从安全渠道获取并验证数据) $data = [ 1 => ['name' => '张三', 'email' => 'zhangsan@example.com'], 2 => ['name' => '李四', 'email' => 'lisi@example.com'], 3 => ['name' => '王五', 'email' => 'wangwu@example.com'] ]; // 构建SQL语句 $sql = "UPDATE users SET "; $columns = ['name', 'email']; foreach ($columns as $col) { $sql .= "$col = CASE id "; foreach ($data as $id => $values) { $safeValue = mysqli_real_escape_string($conn, $values[$col]); $sql .= "WHEN $id THEN '$safeValue' "; } $sql .= "END, "; } $sql = rtrim($sql, ', ') . " WHERE id IN (" . implode(',', array_keys($data)) . ")"; // 执行查询(需提前建立$conn数据库连接) if (mysqli_query($conn, $sql)) { echo "成功更新".mysqli_affected_rows($conn)."条记录"; } else { echo "更新失败: ".mysqli_error($conn); } ?> ``` **注意事项:** 1. 安全防护: - 必须使用`mysqli_real_escape_string`过滤动态值 - 主键值建议强制转换为整型:`$id = (int)$id;` - 推荐使用预处理语句(但需注意预处理对动态CASE语句的限制) 2. 性能优化: ```php // 分批处理(每批100条) $chunks = array_chunk($data, 100, true); foreach ($chunks as $batch) { // 生成并执行批量更新语句 } ``` 3. 事务处理: ```php mysqli_begin_transaction($conn); try { // 执行批量更新 mysqli_commit($conn); } catch (Exception $e) { mysqli_rollback($conn); throw $e; } ``` **替代方案**(适用于简单场景): ```php $updates = []; foreach ($data as $id => $row) { $safeName = mysqli_real_escape_string($conn, $row['name']); $safeEmail = mysqli_real_escape_string($conn, $row['email']); $updates[] = "WHEN $id THEN '$safeName'"; // 同理处理email字段 } // 注意:需要分别构建每个字段的CASE语句 ``` 建议根据实际数据量选择方案,超过100条记录推荐使用CASE WHEN方式,较小数据量可使用多条UPDATE语句(需开启事务保证原子性)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值