php 2个存储过程.,php – 2个准备好的语句,2个存储过程,1个mysqli连接

问题

如何使用预准备语句(或另一种对SQL注入同样安全的查询方法)在同一mysqli连接中调用两个MySQL存储过程,而不会出现以下错误:

Warning: Packets out of order. Expected 1 received 61. Packet size=7 in /...

Warning: mysqli::prepare(): MySQL server has gone away in /...

故事

我正在使用MySQL数据库制作PHP后端.我想从一个查询中得到两个结果:每周摘要列表,以及所有周的摘要.

┌───────┬────────────┬────────────┬─────

| Week | Sales | Commission | ...

├───────┼────────────┼────────────┼─────

| week1 | $7,912.12 | $923.41 | ...

| week2 | $6,423.48 | $824.87 | ...

| week3 | $8,180.67 | $634.04 | ...

| ... | ... | ... | ...

├───────┼────────────┼────────────┼─────

| total | $67,012.23 | $7,532.58 | ...

| avg | $7,012.54 | $787.38 | ...

└───────┴────────────┴────────────┴─────

我曾经只将每周摘要存储在数据库表中,并使用存储过程来获取所有每周摘要的摘要.在我的PHP代码中,我只选择了周表中的所有行,然后调用了getWeeksSummary存储过程.

现在我必须能够过滤每周摘要中的数据.我用存储过程getWeeks()替换了一个简单的SELECT … FROM周来计算所有的每周摘要.

$weeksSummary = new stdClass();

if ($stmt = $mysqli->prepare('CALL getWeeks(?,?,?);')) {

$stmt->bind_param('sss', $a, $b, $c);

$stmt->execute();

$stmt->bind_result($week, $sales, $commission, ...);

$weeksSummary->weeks = [];

while($stmt->fetch())

{

$week = new stdClass();

$week->week = $week;

$week->sales = $sales;

$week->commission = $commission;

...

$weeksSummary->weeks[] = $week;

}

$stmt->free_result();

$stmt->close();

}

if ($stmt = $mysqli->prepare('CALL getWeeksSummary(?,?,?);')) {

$stmt->bind_param('sss', $a, $b, $c);

$stmt->execute();

$stmt->bind_result($avgSales, $totSales, $avgCommission, $totCommission ...);

$stmt->fetch();

$weeksSummary->summary = new stdClass();

$weeksSummary->summary->avgSales = $avgSales;

$weeksSummary->summary->totSales = $totSales;

$weeksSummary->summary->avgCommission = $avgCommission;

$weeksSummary->summary->totCommission = $totCommission;

...

$stmt->free_result();

$stmt->close();

}

echo json_encode($weeksSummary);

当第一个准备好的声明是SELECT周,销售,佣金,…… FROM周WHERE a =?,b =?,c = ?;而不是CALL getWeeks(?,?,?);.现在我收到这些错误:

Warning: Packets out of order. Expected 1 received 61. Packet size=7 in /...

Warning: mysqli::prepare(): MySQL server has gone away in /...

尝试

1)失败:我为第二个查询使用了新的语句对象$stmt2.同样的错误.

2)成功:我关闭了mysqli连接并在第二个语句之前打开了一个新连接.与其自己的预处理语句的第二个mysqli连接运行正常,但连接到数据库的代码保持完全独立,因此这并没有真正帮助.

3)失败:出于好奇,我回到原来的工作代码并重新排序语句,将存储过程语句放在SELECT语句之前.同样的错误.所以mysqli连接在存储过程之前的查询很好,但是在存储过程之后不喜欢任何东西.

4)失败:我尝试使用$mysqli-> next_result();在第一次声明之后.同样的错误.但是,如果我使用query()而不是prepare()来调用存储过程,则next_result()确实允许两个存储过程运行.我想使用预备语句,因为它们有助于防止SQL注入.

不良潜在的解决方案

A):我可以将它分成两个后端调用,但是当数据刷新时,前端的摘要将不同步.

B):我可以将它们加入到一个MySQL存储过程中,然后在PHP中将它们分开,但我也需要将它们分开,所以相同的代码会有两次.

C):我可以停止使用预准备语句,但我不知道任何其他方法来避免SQL注入.

救命

有什么建议?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值