【发布时间】:2017-01-02 05:19:21
【问题描述】:
我有一个函数可以检查数据库中是否存在用户数据并返回用户的电子邮件 ID。如果它没有退出,那么它会插入并返回插入的用户电子邮件。
我的部分功能
function checkUser($userdata){
$oauth_uid = $userdata->id;
$email = $userdata->emailAddress;
$check = $this->db->query("SELECT * FROM $this->userTable WHERE oauth_uid = '".$oauth_uid."' AND email = '".$email."'");
if(mysqli_num_rows($check) > 0){
$result = $check->fetch_array(MYSQLI_ASSOC);
$query = "UPDATE $this->userTable SET fname = '".$userdata->firstName."', lname = '".$userdata->lastName."', email = '".$userdata->emailAddress."', location = '".$userdata->location->name."', country = '".$userdata->location->country->code."', picture_url = '".$userdata->pictureUrl."', profile_url = '".$userdata->publicProfileUrl."', modified = '".date("Y-m-d H:i:s")."' WHERE id = ".$result['id'];
$this->db->query($query);
return $result['id']; //this works it returns email of user if exists
}else{
$query = "INSERT INTO
$this->userTable(oauth_provider,oauth_uid,fname,lname,email,location,country,picture_url,profile_url,created,modified)
VALUES('linkedin','".$userdata->id."','".$userdata->firstName."','".$userdata->lastName."','".$userdata->emailAddress."','".$userdata->location->name."','".$userdata->location->country->code."','".$userdata->pictureUrl."','".$userdata->publicProfileUrl."','".date("Y-m-d H:i:s")."','".date("Y-m-d H:i:s")."')";
$this->db->query($query);
$id = $this->db->insert_id;
$check = $this->db->query("SELECT * FROM $this->userTable WHERE oauth_uid = '".$id."'");
if(mysqli_num_rows($check) > 0){
$result = $check->fetch_array(MYSQLI_ASSOC);
return $result['id']; //this doesnt work. It inserts the data into database but doesn't return anything.
}
}
}
if 语句正常工作。它检查用户是否存在然后返回电子邮件。
else 部分起作用。它将用户插入数据库但不返回电子邮件 我怎样才能使这项工作。
谢谢。
【问题讨论】:
-
以为骗子是针对 PDO 的,它仍然有效。插入之前不需要 SELECT 并且没有使用准备好的语句
-
您对SQL injection 敞开心扉。您需要使用准备好的语句,而不是将变量连接到查询中。见How can I prevent SQL injection in PHP?。
-
@e4c5 它不重复我的完全不同的问题。
-
@EdCottrell 我没有从网页上的某种形式获取这些数据。它的复杂性介于两者之间。用户甚至无法访问这个复杂的 url,并且每次都生成新的 url,但除此之外。我正在尝试将电子邮件插入数据库时返回。