php 执行mysql存储过程后 再执行sql 失败_[轉]PHP执行MYSQL存储过程报错:Commands out of sync; you can't run this command now ...

在PHP同一事物里调用MYSQL的存储过程后再次执行另外的一个或多个命令(或者在同一事物里执行多个存储过程),如果使用mysqli的query方法获得结果,将获得一个错误:Commands out of sync; you can't run this command now sss 先给出代码:

存储过程:

cbab5873d817c189a07f7eb52ec8817c.gifCREATE PROCEDURE test1()

a1e7420029b593021d4df461bfa4301b.gifbegin

ddf96920e4eee55bd3f9432be743cb8b.gif        drop table if exists tb1;

6017068a2f922518c533d5638480e8e3.gif    create table tb1

958311ae0e56da2e5763c46d3f68784c.gif     (

295fc42f554018e84893f304b2c24765.gif         val int not null

74099686347613ac33c17adc8bc65a47.gif     )engine = innoDB;

88f025d41059c58a017ea6f8de5ba066.gif    insert into tb1(val) values(1),(2),(3);

2cd47cf771c205e63b86dd3d56ec1944.gif    select * from tb1;

6859c2889d17ef074811f04f6427d9a5.gifend

PHP代码:

03790453dd4c850c8f0dcb7649b508a2.gif<?php

b958c8383a068c7696ddd89b.jpg$mysqli = new mysqli("localhost", "root", "sbqcel", "test");

e98d0b0c133fa21eb3cb0223c99df0f9.gif

a0ddfe209bef4b80f2f5103ecd8dac64.gifif (mysqli_connect_errno())

19faa72d6d9b46c6dcac725de1e514aa.gif{

f9dcba5da1d7088d1e13433f98989ea4.gif    printf("Connect failed: %s\n", mysqli_connect_error());

464837659c93c25985cb60de48efd9dc.gif    exit();

f94adf61a9e8940a1068319e69f1e20a.gif}

6e4da77bedd866a10bd1879b.jpg$result = null;

5d050ecc3a08904500e9289b.jpg$mysqli->autocommit(FALSE);

40b096706d4955b18b4f0c8bdbf869f5.gifif(!($result = $mysqli->query( "call test1();")))

52e7150e373d49b237d1229b.jpg{

0834f9e77800327bb838209b.jpg    echo mysqli_error($link);

2d424cffd2f339009aea7e64b1986b70.gif    $mysqli->rollback();

b2fb9bcaed0e141092321a952d18bf89.gif}

3c1a7862d1e4f888e6113a9b.jpg$mysqli->commit();

1792ef6e31ad78fef29d9417d53af2f9.gif

810bfa2ce40fb4b98b13999b.jpgprint 'Result1:';

7f3959ee6023310e982e936b8f982ba8.gif

051e0aef94ca8043fcfa3c9b.jpgwhile ($row = $result->fetch_row())

2fa614b1145509a7dc88da0be84c11cb.gif{

348a6367b5a503f69543ebde4faa537f.gif        printf ("%s
", $row[0]);

f9cbce279b00ea56908f9d9b.jpg}

68d77ba01dc809f913211f9131d0119b.gif$result->close();

8e220251ad0fa9da8d54309b.jpgmysqli_free_result($result);

b6873fcb3a0ed8c3cbc88d866367ea73.gif

eb56bae346e30f4965c2f829eca920b1.gifecho 'result2:
';

4f6b5a0713faa975872a97389b790dc9.gifif ($result2 = $mysqli->query("select val from tb1;"))

99b5d006ad62f822da592feb79a31d82.gif{

5e2d4dfefff4a1645d60089b.jpg    while ($row = $result2->fetch_row())

479ffdac09b85374d0d9a3c69705bca4.gif     {

4eb5f8fbb12a5e436c22eb9b.jpg        printf ("%s
", $row[0]);

2fb899a8340e90e4ca130c9b.jpg     }

1bcb7a4cba46954369c7e8c1817b388d.gif    $result2->close();

1dccec74f21090f319f79921eba9d184.gif}

1efae24a27755b7608f7ef9b.jpgelse

dffd8dbfc5fb959d0807337874a9488b.gif{

ea4894c406e2e9ce03da5a22b1a26ab7.gif    echo $mysqli->error;

a2f9a12c9e923cbc81b5c17e7877a147.gif}

ad0cdd8f98799a09cb42ecfce0c9cb7e.gifmysqli_free_result($result2);

05a675b18c36fa74b5c410e6feba9a9c.gif

cafa5e35e603c1b47815ce2d626a305c.gifmysqli_close($link);

3a0481b74b937b4a0f8e5678de2df76a.gif?>

执行上面的代码后就会出现上面的错误,消息说明MYSQL数据库认为是这一个错误的命令执行顺序。原因在于MYSQL的存储过程执行完成后除了返回实际结果集还会返回存储过程执行的转态

,而上面的代码仅处理了第一个结果集,第二个结果集并没有被释放掉。

When a stored procedure returns a resultset, MySQL returns at least two resultsets: first for the SELECT CALL inside the stored procedure. 2ndfor the call of the stored procedure itself

(2nd usually is only an OK or ERR packet).

要解决这个问题,需要用mysqli的multi_query方法,遍历所有的结果集并释放掉掉。代码如下:

fb58025bfcaa7d693277097b5f1661cf.gif<?php

4a3653bed8a8079a59ea86004659e6f1.gif$mysqli = new mysqli("localhost", "root", "sbqcel", "test");

ee64d4cd7b2e365caea70cb4216a6c2d.gif

1d9a3e4f09af777bc52592de40acce56.gifif (mysqli_connect_errno())

f4e6aa1e561fcde91fb95760d204ff12.gif{

89275ad124a6656b1ab29039a392deee.gif    printf("Connect failed: %s\n", mysqli_connect_error());

f027e2c8bdb956942d98969ee08ffbfc.gif    exit();

4e5355f87fad278654ef86e8fb0fd6bb.gif}

f5378a2f2581fe457222302a7071347d.gifecho 'result1:
';

2d3ff115718ac3cd89e744e6f50be69c.gif$mysqli->autocommit(FALSE);

aa217a2a7d883878d52af19b.jpgif ($mysqli->multi_query("call test1();"))

8ec7ec3415db2d1b241f149b.jpg{

5a7cec935b2247bb08c48911b936a297.gif    do {

1381882dcbfb3561359bf79b.jpg        if ($result = $mysqli->store_result()) {

a7f28534154a1e6e5ab5f59b.jpg            while ($row = $result->fetch_row()) {

286d64ea301f2b86d439c99b.jpg                printf("%s\n", $row[0]);

56c738ca5719bad3c817689b.jpg             }

a2100a8641c6626b66096e9b.jpg            $result->close();

bacfd23eedd8d46871cf6c9b.jpg         }

66169bd3f2e8ab553bf3cf9b.jpg     } while ($mysqli->next_result());

14d1643dfc1e26929e3d629b.jpg}

a6e11b00132227d2e850cd9b.jpg$mysqli->commit();

031796c711ece589d000609b.jpgecho "
";

ece555dc41d1a7f4cc11669b.jpgecho "result2:
";

492b9787c281287fc75cc39b.jpgif ($result2 = $mysqli->query("select val from tb1;"))

984343ba8ee153515106bde3e5b79799.gif{

591aa96bdd598f050dfd244c6909475e.gif    while ($row = $result2->fetch_row()) {

209b56f283c08e46b17ec59b.jpg        printf ("%s
", $row[0]);

46a88c89d8efc0e433727826a8ef54f2.gif     }

bec9df8bd3c1a447c9fc7a9b.jpg    $result2->close();

f3d3fb70e8ba2a8d389b71d9cea37ce3.gif}

bb246ece5b2ce15693457e9b.jpgelse

b02551030894cbddd53f7c9b.jpg{

e2fb3add9895b0615882dd9b.jpg    echo $mysqli->error;

e19d7b8848ee9ac1a5c2729b.jpg}

8038cf31e653da16eff74cee3ae3376d.gif$mysqli->close();

b3cbc9a31d6476e5cb8c70e028b062ad.gif?>

在PHP同一事物里调用MYSQL的存储过程后再次执行另外的一个或多个命令(或者在同一事物里执行多个存储过程),如果使用mysqli的query方法获得结果,将获得一个错误:Commands out of sync; you can't run this command now sss 先给出代码:

存储过程:

22c97eb89b974aa606cfbcccfb1fe443.gifCREATE PROCEDURE test1()

a1c3a3f4b904b03bdcc4749b.jpgbegin

427566ef37d85663adafd59b.jpg        drop table if exists tb1;

508d78ba4b16325a6bc3382b6b45f1d9.gif    create table tb1

ae1cfcda271a248eb7fd489b.jpg     (

df7783dde61d618c8c10299b.jpg         val int not null

c525ff667ac71471aa184c9b.jpg     )engine = innoDB;

d014d1d9cac11cbc38012f9b.jpg    insert into tb1(val) values(1),(2),(3);

a3cea42407c98a7ed507429b.jpg    select * from tb1;

3276dfbddbd1845c5136db224adf824e.gifend

PHP代码:

cbd6d6ec19362b842e2e219b.jpg

a7df98fa561c66dc9f51469b.jpgCode1

0976ef0ec5a8480f6ab7616ced718e0e.gif<?php

eaa6550e1abc1b869bc4917775292751.gif$mysqli = new mysqli("localhost", "root", "sbqcel", "test");

2609f162991fcf6d84eb8ce46c1949f2.gif

3b62fe13dec7854a61a9718f11c8173c.gifif (mysqli_connect_errno())

7cfcefa76fe2d5c0d043589b.jpg{

e888e2c286b39860e4dd3b9b.jpg    printf("Connect failed: %s\n", mysqli_connect_error());

96054a11c73e6b93a6ef3f9b.jpg    exit();

14a187f77e1067cd15440e0764bfeb96.gif}

05802c89e10e7e6e2f2dbf178b8db81d.gif$result = null;

6a78c4c11343b5e20542f5520fb22615.gif$mysqli->autocommit(FALSE);

f1daf7af1ade56aefaed509b.jpgif(!($result = $mysqli->query( "call test1();")))

d437631bc6c7e0afae51339b.jpg{

eece50faf280ee8bb58f319b.jpg    echo mysqli_error($link);

267dd6d085697d226c94db8c33a017e7.gif    $mysqli->rollback();

88350664c19e65a5f636549b.jpg}

dc895edeeb5e910195ee379b.jpg$mysqli->commit();

1908729230192bc878d12a0c62cc74d7.gif

7097d5f033e7b2967b31aa64.jpgprint 'Result1:';

84ee02c3bfe01700b119a864.jpg

e7365d1f59f830a0e1fe0b9b.jpgwhile ($row = $result->fetch_row())

0ae9a7557bc8f691b545ae64.jpg{

49f180f5852f8470bd31099b.jpg        printf ("%s
", $row[0]);

c0c146c47d945efc8026ac64.jpg}

c49deea94ef7d2a91c17a264.jpg$result->close();

93263425dbe0413535a80f9b.jpgmysqli_free_result($result);

4770f3dfe660d6464854039b.jpg

f1fe62fcd0c697d7bb01a064.jpgecho 'result2:
';

6dcf278269d057c5f403a664.jpgif ($result2 = $mysqli->query("select val from tb1;"))

3a8ca423b2854b1b9358079b.jpg{

07ea03f77d1af320281555b831177fe0.gif    while ($row = $result2->fetch_row())

ae8cfb4ee389cc5cb2de059b.jpg     {

7828803dbf9b9e4cc5f7f49f778fa799.gif        printf ("%s
", $row[0]);

e1807c09c00f81d7d0581b9b.jpg     }

daaf941265caad04fa19b864.jpg    $result2->close();

c0c31d5120c89b4d347abe64.jpg}

8bc12b18ecabc7e148edbc64.jpgelse

a28061bf1b509d5f18d81f9b.jpg{

1f592d0a6009a16bb0351d9b.jpg    echo $mysqli->error;

45a277b4963c332689d4b264.jpg}

6a00113ecae42eaf838b139b.jpgmysqli_free_result($result2);

393583735505ae498501b064.jpg

f80c1e1c67d0bcde85d6b664.jpgmysqli_close($link);

55b8e49d903c283da6025b454818b729.gif?>

执行上面的代码后就会出现上面的错误,消息说明MYSQL数据库认为是这一个错误的命令执行顺序。原因在于MYSQL的存储过程执行完成后除了返回实际结果集还会返回存储过程执行的转态

,而上面的代码仅处理了第一个结果集,第二个结果集并没有被释放掉。

When a stored procedure returns a resultset, MySQL returns at least two resultsets: first for the SELECT CALL inside the stored procedure. 2ndfor the call of the stored procedure itself

(2nd usually is only an OK or ERR packet).

要解决这个问题,需要用mysqli的multi_query方法,遍历所有的结果集并释放掉掉。代码如下:

abf9a24b4f5e544fb925bb782528984a.gif<?php

52980c5cfaf719b7f3657cfd63c3bf69.gif$mysqli = new mysqli("localhost", "root", "sbqcel", "test");

4396881f101bcc9da686699b.jpg

9afc159943d0515d6c068c64.jpgif (mysqli_connect_errno())

e6127cc82057d4427e3e6f9b.jpg{

dad9e10882d700c0087b8264.jpg    printf("Connect failed: %s\n", mysqli_connect_error());

1ddeb095e4aa1f5d79f48064.jpg    exit();

0ce6ca0942ec6d9a3ac7639b.jpg}

79a3af088b25178460d98664.jpgecho 'result1:
';

082ca7d19008ef86552c8464.jpg$mysqli->autocommit(FALSE);

bae5ddcfb6168268f9dc619b.jpgif ($mysqli->multi_query("call test1();"))

481f323d770dcc55bba1679b.jpg{

11015fd3a3fd0c8aabec9a64.jpg    do {

b146e4774635b017d72e099eb8537c71.gif        if ($result = $mysqli->store_result()) {

5363fb01abbf634eb7aaad38658a67ee.gif            while ($row = $result->fetch_row()) {

35a72ba2e7edbec4f3a54c89d690099b.gif                printf("%s\n", $row[0]);

89704cdcf474bb8423c22c1296a5f50b.gif             }

00a200a6e8ae61cc998f44475e7987d4.gif            $result->close();

caca65fc541fdea8fd037f9b.jpg         }

b0166efd65d28f10d7887d9b.jpg     } while ($mysqli->next_result());

10ffcfd00dd28cdaa2ec9c64.jpg}

130064e12e635516ee499c340d36e817.gif$mysqli->commit();

174486487c10295d791c0b488d7df1f4.gifecho "
";

a550793f1a45b9977c1e719b.jpgecho "result2:
";

69ec37d9076815a7e3444994b425a12e.gifif ($result2 = $mysqli->query("select val from tb1;"))

88ee7f529f2d530f19f39e48752e4f0a.gif{

0ec67f1baf250680ac6e759b.jpg    while ($row = $result2->fetch_row()) {

7d2cb6d50ebfc09150da4b9b.jpg        printf ("%s
", $row[0]);

22022ccb9e0aaba853664f9b.jpg     }

26231ffb47c470774d4aea64.jpg    $result2->close();

30cec02249983df14423e864.jpg}

c84f9e97e00dd2589e0835568739456c.gifelse

3c928da44ef114a29252ee64.jpg{

7afc06183afac95234fa419b.jpg    echo $mysqli->error;

35fba4f79a808577700eec64.jpg}

3ba2265c7c8690bd6de7e0919c06f3da.gif$mysqli->close();

98c5edc325339493dc32f85f7f73bc5f.gif?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值