gpt4 book ai didi

php - 测试sqlite表中是否存在值的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-03 18:40:12 25 4
gpt4 key购买 nike

这里的第一个问题,所以如果我做了一些愚蠢的事情,请不要打我!

我正在创建一个包括注册等的登录系统,并且通过注册我需要测试 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 次来测试每个项目?

这是我第一次使用数据库解决方案的真正冒险。非常感谢任何有用的输入 - 在此先感谢!

编辑:我确实需要单独测试每个值,以便我可以使用适当的错误消息重建注册表单,准确说明需要更改的内容。对不起,我应该更具体。

编辑: 解决方案 - 谢谢你 Shakti Singh 和其他所有人的帮助。

该函数(使用带有命名占位符的准备好的语句):
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;
}
}
}

我只是觉得我应该添加这个以防其他人像我一样挣扎,总是很高兴有工作示例 - 也有评论^_~

我很确定这将是我的最后一次编辑,但嗯..永远不知道。

最佳答案

不要重复该过程 3 次来测试每个项目。

只需创建一个通用方法或函数,它将为您要检查的每个项目调用,并根据数据库值返回 true 或 false。

function item_exists($item_value,$item_type)
{
$IDq = $userdbc->query("SELECT * FROM users WHERE $item_type= '$item_value'");
$IDq->setFetchMode(PDO::FETCH_ASSOC);
$IDf = $IDq->fetch();
if($IDf[$item_type])
{
return true;
}
else
{
return false;
}
}

并像这样调用函数
if (item_exists($userID, 'userID') === true)
{
echo 'user_id exists';
}

if (item_exists($emailID, 'email') === true)
{
echo 'email exists';
}

这种方法会让你知道什么是重复的。这样您就可以向最终用户显示消息。

关于php - 测试sqlite表中是否存在值的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6420944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com