PHP调用Twilio API发送SMS时正文缺失MySQL存储的code值
问题根因
短信正文不携带code值是数据库查询逻辑缺失导致的:
- 执行
mysqli_query()后没有接收返回的查询结果集 - 没有从结果集中读取数据行赋值给
$row,直接调用$row['code']时$row是未定义状态,因此$sms为空值,最终拼接出来的短信正文自然没有凭证内容。 - 代码没有添加数据库连接、SQL执行的错误校验,出现异常时无法快速定位问题。
修复后可运行代码
<?php require __DIR__ . '/vendor/autoload.php'; use Twilio\Rest\Client; // Twilio凭证生产环境建议存环境变量,不要硬编码 $account_sid = 'ACc9ff'; $auth_token = '7f1ffa'; // 建立数据库连接,增加连接错误判断 $connect = mysqli_connect("localhost", "jk47531_voucher", "Mmmm0;4", "u825147531_voucher"); if (!$connect) { exit("数据库连接失败:" . mysqli_connect_error()); } $sql = "SELECT code FROM plan50 ORDER BY RAND() LIMIT 1"; $result = mysqli_query($connect, $sql); // 增加SQL执行错误判断 if (!$result) { exit("凭证查询失败:" . mysqli_error($connect)); } // 从结果集中读取一行数据 $row = mysqli_fetch_assoc($result); $sms = $row['code'] ?? ''; mysqli_free_result($result); // 如果凭证为一次性使用,在此处添加UPDATE语句,将当前取出的code标记为已发放,避免重复发送给不同用户 $twilio_number = "+18647963358"; $client = new Client($account_sid, $auth_token); // 增加空code判断,避免发送无效短信 if (empty($sms)) { exit("无可用凭证码,终止发信"); } $client->messages->create( '+25XXXXXXXXXX', [ 'from' => $twilio_number, 'body' => "your Voucher code is $sms" ] );
优化建议
- 生产环境不要把数据库账号密码、Twilio认证信息硬编码在代码中,建议通过环境变量读取这类敏感配置,降低泄露风险
- 若
plan50表中存储的是一次性使用的兑换码,取码后必须更新对应记录的状态为已使用,否则高并发场景下会出现同一个码发给多个用户的问题 - 建议在发信逻辑前增加凭证非空校验,避免把无有效凭证的短信发给客户,影响用户体验
内容的提问来源于stack exchange,提问作者moses musyoki
相关产品推荐
相关产品推荐

