【发布时间】:2014-06-16 04:02:27
【问题描述】:
我正在尝试在我的网站中使用 mysqli bind_param 函数来注册用户。我想做两件事:
如果用户使用我提供的注册表单进行注册,请将数据库中的用户密码设置为他们想要的密码(当然是散列和加盐);
如果他们使用 Facebook 注册,请将密码字段设置为 NULL。
我意识到我可以将数据库中的密码列的默认值设置为 NULL,而只是在注册时的语句中不指定它,但是这个问题也会影响到网站的其他方面,这不切实际分辨率。
$password = null;
$stmt->bind_param('ssssss', $email, $password, $fullname,
$prof_image_url, $splash_image_url, $facebook_id);
出于测试目的,我在调用语句之前直接将变量 $password 设置为 null,但它仍然会发生。执行查询时,它会导致一行密码列为空,而不是在我通过命令行查看时显示为 NULL。
非常感谢所有帮助!
编辑: 这是密码列的结构...... 字段:密码, 类型:varchar(255), 空:是的, 钥匙:, 默认值:空, 补充:
function user_add($mysqli, $email, $password, $fullname, $prof_image_url = null, $splash_image_url = null, $facebook_id = null) {
if ($mysqli == null) throw new Exception('Could not connect to database.');
if ($email == null || $email == '') throw new Exception('Email is required.', 1);
if ($password != null && $password == '') throw new Exception('Password is required.', 1);
if ($fullname == null || $fullname == '') throw new Exception('Name is required.', 1);
if ($prof_image_url == null) $prof_image_url = IMAGE_PATH . '/profile_default.png';
if ($splash_image_url == null) $splash_image_url = IMAGE_PATH . '/splash_bg_1.jpg';
$email = $mysqli->real_escape_string($email);
$password = $mysqli->real_escape_string($password);
$fullname = $mysqli->real_escape_string($fullname);
$facebook_id = $mysqli->real_escape_string($facebook_id);
$stmt = $mysqli->prepare('INSERT INTO users(`email`, `password`, `full_name`, `prof_image_url`, `splash_image_url`, `facebook_id`) VALUES(?, ?, ?, ?, ?, ?);');
if (!$stmt) {
throw new Exception('Could not connect to database.');
}
$stmt->bind_param('ssssss', $email, $password, $fullname, $prof_image_url, $splash_image_url, $facebook_id);
if (!$stmt->execute()) {
throw new Exception('Could not register user.', 1);
}
return $mysqli->insert_id;
}
这就是我调用函数的地方:
function account_facebook_register($mysqli, $code){
$token_url = "https://graph.facebook.com/oauth/access_token?"
. "client_id=" . FACEBOOK_APP_ID
. "&redirect_uri=" . urlencode(FACEBOOK_REDIRECT_URL)
. "&client_secret=" . FACEBOOK_APP_SECRET
. "&code=" . $code
. "&scope=email";
$response = @file_get_contents($token_url);
$params = null;
parse_str($response, $params);
$token = $params['access_token'];
$graph_url = "https://graph.facebook.com/me?access_token=" . $token;
$user = json_decode(file_get_contents($graph_url));
if (!isset($user->email)){
$_SESSION['error'] = 'Invalid email on Facebook account.';
$_SESSION['error_level'] = 1;
header('Location: ' . WEB_ROOT . '/account/register.php');
die;
}
$user_exists = user_getByEmail($mysqli, $user->email);
if ($user_exists == null){
$mysqli = mysql_create();
$password = null;
$uid = user_add($mysqli, $user->email, $password, $user->name, 'https://graph.facebook.com/' . $user->id . '/picture?type=large', null, $user->id);
$token = facebook_get_long_token($token);
token_add($mysqli, $uid, 'facebook', $token, $user->id);
$_SESSION['fb_token'] = $token;
$_SESSION['uid'] = $uid;
$_SESSION['success'] = "Registration Successful!";
}else{
account_facebook_login($mysqli, $user_exists->uid);
}
}
mysql_create 函数只是设置数据库以供访问并按预期工作。 谢谢!
回答: mysqli->real_escale_string 使空值为空。在转义之前检查变量是否为空。
【问题讨论】:
-
显示空列而不是null是完全正常的,即使是...
-
@chility 即使我使用“从密码为空的用户中选择 *;”它不显示任何密码列为空的行。
-
不过,您将需要显示更多代码 -- DB Schema 将与执行查询的实际代码一起提供帮助。
标签: php mysql sql parameters mysqli