MySQL存储过程字符串参数问题及PHP调用报错求助
问题分析与解决建议
错误1:存储过程参数与字段解析冲突
你的存储过程中WHERE user_username=username存在歧义:MySQL会优先把username解析为db.dbo表的列名,而非你定义的输入参数。当表中不存在username列时,就会触发报错。
修复方案:
修改存储过程,给参数重命名避免冲突,或者明确指定参数来源:
DELIMITER // CREATE PROCEDURE retrieve_user_info (IN p_username VARCHAR(50)) BEGIN SELECT * FROM db.dbo WHERE user_username = p_username; END // DELIMITER ;
或者不修改参数名,用存储过程名限定参数:
DELIMITER // CREATE PROCEDURE retrieve_user_info (IN username VARCHAR(50)) BEGIN SELECT * FROM db.dbo WHERE user_username = retrieve_user_info.username; END // DELIMITER ;
错误2:PHP调用未处理字符串参数,存在SQL注入风险
直接将$enteredusername拼入SQL语句时,字符串参数会被MySQL当作列名解析(这就是报错中Unknown column 'wowcrofty'的直接原因),同时这种写法存在严重的SQL注入漏洞。
修复方案:
使用MySQLi预处理语句安全调用存储过程:
// 准备预处理语句 $stmt = $conn->prepare("CALL retrieve_user_info(?)"); // 绑定字符串类型参数 $stmt->bind_param("s", $enteredusername); // 执行语句 $stmt->execute(); // 获取查询结果 $result = $stmt->get_result();
内容的提问来源于stack exchange,提问作者Matt Croft
相关产品推荐
相关产品推荐

