PHP从API获取数据写入MySQL时字段值异常问题求助
问题原因
- 核心问题是你的SQL插入语句中,字符串类型的字段值没有用单引号包裹。
sender字段对应存储的$transaction->from一般是字符串类型(比如链上地址哈希),直接拼接进SQL时没有引号,MySQL会将其识别为数值进行隐式转换,最终写入数据库的内容和原始值完全不一致。 - 额外问题:直接拼接外部来源参数到SQL语句存在严重的SQL注入风险,且你使用的
mysql_*系列函数已经在PHP 7.0及以上版本被完全移除,兼容性和安全性都没有保障。
解决方案
临时验证方案(仅用于确认问题,不推荐生产使用)
给字符串类型的参数加上单引号,同时对参数做转义处理,避免特殊字符破坏SQL语法:
// 假设你已有数据库连接实例$conn,使用mysqli做转义示例 foreach ($transactions->result as $transaction) { echo "From: " . $transaction->from . "<br>"; echo "Value: " . $transaction->value . "<br>"; echo "Time: " . $transaction->timeStamp . "<br>"; echo "<hr>"; $from = mysqli_real_escape_string($conn, $transaction->from); $value = mysqli_real_escape_string($conn, $transaction->value); $timeStamp = mysqli_real_escape_string($conn, $transaction->timeStamp); mysql_insert("INSERT INTO `api` (`sender`, `amount`, `time`) VALUES ('$from', '$value', '$timeStamp');"); }
生产环境推荐方案
改用PDO或者MySQLi的预处理语句实现数据库操作,既可以自动处理参数的类型识别、转义、引号包裹,也能彻底避免SQL注入风险,同时兼容目前所有支持的PHP版本。以下是PDO实现示例:
<?php // 初始化PDO数据库连接,替换为你自己的数据库配置 $pdo = new PDO('mysql:host=127.0.0.1;dbname=你的数据库名;charset=utf8mb4', '数据库用户名', '数据库密码'); // 设置PDO错误模式为异常模式,方便调试 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $url = "hiddenurl"; $transactions = json_decode(file_get_contents($url)); // 预编译SQL语句,只需要编译一次,循环内重复执行性能更高 $insertStmt = $pdo->prepare("INSERT INTO `api` (`sender`, `amount`, `time`) VALUES (?, ?, ?)"); foreach ($transactions->result as $transaction) { echo "From: " . $transaction->from . "<br>"; echo "Value: " . $transaction->value . "<br>"; echo "Time: " . $transaction->timeStamp . "<br>"; echo "<hr>"; // 绑定参数执行,不需要手动处理引号和转义 $insertStmt->execute([ $transaction->from, $transaction->value, $transaction->timeStamp ]); } include 'layout/overall/footer.php'; ?>
内容的提问来源于stack exchange,提问作者curbside
相关产品推荐
相关产品推荐

