我有以下SQL语句已被验证为有效:
INSERT INTO community_players (community_id, player_id)
SELECT communities.id, users.id
FROM communities INNER JOIN users ON communities.admin = users.user_email
WHERE users.user_email = 'steve.downs@gmail.com'
AND communities.code = 'HX99f9'
我现在想用下面php函数中的变量替换虚拟电子邮件和社区代码数据,并将其提交到数据库。
这是我的功能:
public function insertNewAdminIntoCommunity($email, $code)
{
$sql = "insert into community_players (community_id, player_id) select communuities.id, users.id from communuities inner join users on communities.admin = users.user_email where users.user_email = '".$email."' and communities.code = '".$code."'";
$statement = $this->conn->prepare($sql);
if(!$statement) throw new Exception($statement->error);
$statement->bind_param("ss", $email, $code);
$returnValue = $statement->execute();
return $returnValue;
}
然而它将错误抛回到Xcode中 - 我认为在尝试在sql语句中使用函数中的变量时可能会出现错误的语法?
有什么想法吗?
由于
答案 0 :(得分:2)
您不应该像在此处一样将变量连接到SQL字符串中:
users.user_email = '".$email."' and communities.code = '".$code."'";
因为这违背了预备陈述的全部目的。准备好的语句通过允许您定义将被正确转义的值替换的占位符来帮助防止SQL-injection。
因此,您应该使用占位符(问号,不附带引号):
users.user_email = ? and communities.code = ?";
然后$statement->bind_param("ss", $email, $code);
将变量绑定到两个占位符。第一个参数的每个s
表示相应的值应该被视为一个字符串。 1 MySQL负责以这种方式正确地转义值。
因此,错误很可能是告诉您正在尝试将值绑定到不存在的占位符。
mysqli_stmt::bind_param()
documentation。答案 1 :(得分:0)
你在某些领域和其他领域有社区 确保在所有情况下使用正确的表名
$sql = "insert into community_players (community_id, player_id)
select communuities.id, users.id
from communuities
inner join users on communities.admin = users.user_email
where users.user_email = '".$email."' and communities.code = '".$code. "'";
我建议使用带有绑定参数的PDO而不是字符串连接...(以及其他连接)