PHP执行批量mysql语句的解决方法

PHP执行批量mysql语句的解决方法,第1张

当有多条mysql语句连起来需要执行,比如

$sqls=

“insert

table

a

values(1,2)

insert

table

a

values(2,3)”

需要执行的话php中可以使用的方法有三个:

mysql_query

pdo

mysqli

三种方法当sqls语句没有问题的时候都是可以的。

但是

当sql语句是错误的时候会出现问题

第一条sql错误:三个方法都返回false

第一条sql正确,第二条sql错误:mysql_query、pdo、

mysqli:query也是返回true。所以这个时候你是没法判断你的sqls是否有那条语句是错误的。

解决这种办法有几个招:

1

解析sql语句

将每条sql都拆分开来执行。这样每个语句分开执行就解决了。但是这种方法多出了好几种方法,所以不可取。

2

将sqls语句保存为文本

使用cmd执行命令

mysql….

.<

sqls.sql,

然后捕获输出。这也是一种方法,但是感觉是绕着问题走,应该还有更好的方法。

3

使用mysqli::multi_query方法

这个方法可以执行多条sql语句,然后使用mysqli::next_result来设置sql的偏移量,使用mysqli::error获取当前偏移的sql的错误状态

下面是第三种方法的示例代码

代码如下:

复制代码

代码如下:

$sql

=

Config::get('sql')

$content

=

file_get_contents($sql)

$config

=

Config::get('config')

$mysqli

=

mysqli_connect($config['host'],

$config['user'],

$config['password'],

$config['dbname'])

$ret

=

$mysqli->multi_query($content)

if($ret

===

false)

{

echo

mysqli_error($mysqli)

}

while

(mysqli_more_results($mysqli))

{

if

(mysqli_next_result($mysqli)

===

false)

{

echo

mysqli_error($mysqli)

echo

"\r\n"

break

}

}

$mysqli->close()

这样的话当sqls语句中任意一条有错误的话,程序就会跳出这个错误。

如果你要编写初始化mysql的脚本的话,这招就非常好用了。

PHP访问MySQL数据库

因为连接数据库需要较长的时间和较大的资源开销,所以如果在多个网页中都要频繁地访问数据库,则可以建立与数据库的持续连接。即调用mysql_pconnect()代替mysql_connect()。

基本步骤:

1.连接服务器:mysql_connect()

2.选择数据库:mysql_select_db()

3.执行SQL语句:mysql_query()

查询:select

显示:show

插入:insert

into

更新:update

删除:delete

4.关闭结果集:mysql_free_result($result)

5.关闭数据库:mysql_close($link)

近来稍有时间研究了下MYSQL中的事务 *** 作,在很多场合下很是适用,譬如在注册的时候需要初始化很多张关联表的时候,问答回复的时候需要至少同时 *** 作两张表,这些都会在某些时候只能成功更新一张表,而另外的SQL语句出现错误,正常的 *** 作会导致初始化了一张表

,其他的都木有能初始化,这个时候就会导致用户表里的用户信息已经执行插入,导致提示注册失败,但是用户已经注册了部分信息,这个时候需要程序员去数据库删除相应的数据是一个比较不好的事情。

因此这边考虑使用事务,事务可以进行模拟SQL *** 作,当所有的SQL都 *** 作成功的时候才进行SQL *** 作,只要有一个 *** 作失败就回滚当前事务的所有SQL *** 作,避免出现上面描述中出现的数据写入不完整等情况。

下面是鄙人写的一小段代码,欢迎大家参考和提出意见:

复制代码

代码如下:

/**

*

@todo

多条sql的事务处理

*

@param

$sqls

array

*

@return

boole

true/false

*/

public

function

doArraySqlActionsTran($password,$sqls){

$db

=

$this

->

doSqlLink($password)//打开数据库链接

$db

->

autocommit(FALSE)//设置为不自动提交,因为MYSQL默认立即执行

//获取SQL执行结果数组

for

($i=0$i<count($sqls)$i++){

$result[$i]

=

$db

->

query($sqls[$i])

}

//解析SQL执行结果数组

for

($j=0$j<count($result)$j++){

if

($result[$j]==FALSE){

$result[$j]='false'

}else{

$result[$j]='true'

}

}

//查找SQL结果数组中是否存在false结果集

if

(in_array('false',$result)){

$sqlResult=FALSE

}else{

$sqlResult==TRUE

}

//根据结果集进行数据库回滚或者执行 *** 作

if

($sqlResult==FALSE){

$db

->

rollback()//判断当执行失败时回滚

$return=FALSE//

正式环境中使用

//$return='ROOLBACK'//test

标记使用

}else{

$db

->

commit()//执行事务s

$return=TRUE//

正式环境中使用

//$return='COMMIT'//test

标记使用

}

$db->autocommit(true)

//设置为非自动提交——事务处理

$db->close()//关闭连接

return

$return

}

到此事务执行批量SQL *** 作基本完成,谢谢大家!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7458985.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存