Первый вопрос здесь, поэтому, пожалуйста, не бейте меня, если я делаю что-то глупое!
Я создаю систему входа в систему, включая регистрацию и т. Д., И при регистрации мне нужно протестировать 3 вещи, чтобы убедиться, что они уже используются.
Мой начальный тестовый код выглядит примерно так:
$IDq = $userdbc->query("SELECT * FROM users WHERE userID = '$uID'");
$IDq->setFetchMode(PDO::FETCH_ASSOC);
$IDf = $IDq->fetch();
if($IDf['userID']){
echo '<p>ID exists</p>';
}
else{
echo '<p>ID does not exist?</p>';
}
Мне нужно проверить наличие возможных дубликатов электронной почты и отображаемых имен. Я уверен, что должен быть лучший способ сделать это?
Или мне действительно придется повторить процесс 3 раза для проверки каждого элемента?
Это мое первое настоящее предприятие, использующее решение для баз данных. Любая полезная информация очень ценится - заранее спасибо!
РЕДАКТИРОВАТЬ: мне нужно проверить каждое значение в отдельности, чтобы я мог перестроить регистрационную форму с соответствующим сообщением об ошибке с указанием именно того, что нужно изменить. Извините, я должен был быть более конкретным.
РЕДАКТИРОВАТЬ: Решение - спасибо Шакти Сингх и всем остальным за помощь.
Функция (с использованием подготовленного оператора с именованным заполнителем):
function item_exists($dbc, $col, $val){
$query = $dbc->prepare("SELECT * FROM users WHERE $col = :val");
$query->execute(array(':val' => $val));
$fetch = $query->fetch();
if($fetch[$col]){
return true;
}
else{
return false;
}
}
Как я использую его в своей функции проверки регистрации:
$userdbc = new PDO('sqlite:db/users.s3');
if(item_exists($userdbc, 'userID', $_POST['id'])){
$valid = false;
array_push($sub['e'], 'User ID is not available.');
}
if(item_exists($userdbc, 'userEmail', $_POST['email'])){
$valid = false;
array_push($sub['e'], 'Email Address is already in use.');
}
if(item_exists($userdbc, 'userName', $_POST['name'])){
$valid = false;
array_push($sub['e'], 'Display Name already taken.');
}
$userdbc = null;
РЕДАКТИРОВАТЬ: Дополнительно:
Поскольку я тестирую только один элемент, в рамках функции item_exists()
, которую я заменил:
$query->execute(array(':val' => $val));
для:
$query->bindParam(':val', $val);
$query->execute();
.. только потому, что выполнение массива показалось мне глупым, поскольку он содержит только один ключ / значение ..
Не знаю, какова может быть реальная разница, но эй, есть еще один вариант.
РЕДАКТИРОВАТЬ: Дополнительные-Дополнительные:
Функция со всеми внесенными изменениями:
function item_exists($dbc, $col, $val, $rn){
// updated the prepare statement as per James Anderson's suggestion.
$query = $dbc->prepare("SELECT COUNT($col) AS dupli FROM users WHERE $col = :val");
$query->bindParam(':val', $val);
$query->execute();
$fetch = $query->fetch();
// $fetch['dupli'] contains the number of matches found.
// $fetch[0] should also work, but not tested.
if($rn){ // if $rn = true, return the number of finds
return $fetch['dupli'];
}
else{ // else we are just testing for a match so..
if($fetch['dupli'] > 0){ // if we have one
return true;
}
else{
return false;
}
}
}
Я просто чувствовал, что должен добавить это на тот случай, если кто-то еще будет бороться, как я, всегда приятно иметь рабочие примеры - с комментариями тоже ^ _ ~
Я вполне уверен, что это будет мое последнее редактирование, но ... никогда не знаешь.