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

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

我正在创建一个包括注册等在内的登录系统,通过注册我需要测试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';
}

此方法将让您知道重复的内容。这样您就可以作为消息显示给最终用户。

验证IBAN PHP - php

在设计新平台时,我们尝试集成IBAN编号。我们必须确保IBAN已经过验证,并且存储在数据库中的IBAN始终正确。那么验证数字的正确方法是什么? 参考方案 正如我在其他问题中解释的逻辑一样,我尝试自己创建一个函数。根据Wikipedia文章中解释的逻辑,在下面找到合适的功能。国家特定验证。它适合吗http://en.wikipedia.org/wiki/Int…

PHP:对数组排序 - php

请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…

PHP-全局变量的性能和内存问题 - php

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…

php-casperjs获取内部文本 - php

我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…