2017-10-17 17 views
0

J'ai mis en place une connexion pdo et la passe en tant que variable dans une fonction. Tout cela fonctionne très bien et la fonction retourne correctement. Si j'exécute la fonction dans une instruction conditionnelle avec la variable PDO et un nom qui s'exécute correctement - si le nom est dans la base de données, il résonne correctement sinon il résonne aussi correctement. Ce que je veux faire est de passer la valeur d'un post de formulaire à la fonction afin qu'elle vérifie si elle existe dans la base de données. Voici mon code:

La fonction vérifie si le nombre de colonnes est un.

function user_exists($pdo, $username) { 
$stmt = $pdo->prepare('SELECT COUNT(uid) FROM users WHERE username = :username'); 
$stmt->execute(['username' => $username]); 
$result = $stmt->fetchColumn(); 
return ($result == 1); 
} 

Si l'utilisateur admin existe dans la base de données echo 'exists' - Juste pour le test.

if(user_exists($pdo,'admin') == true) { 
echo "exists"; 
} else { 
echo "doesnt exist"; 
} 

Vérifie des deux champs ont été saisis alors je veux vérifier si le nom d'utilisateur est entré dans la base de données, mais je fais quelque chose de mal.

if(!empty($_POST) === true) { 
$username = $_POST['username']; 
$pwood = $_POST['password']; 
if(empty($username) === true || empty($pwood) === true) { 
echo "You need to enter a username and password"; 
} else if (user_exists($pdo,$_POST['username']) == false){ 
echo 'We can\'t find that username. Please try again or register'; 
} 
} 
+0

cette ligne if (! Empty ($ _ POST) === true) { ' – Akintunde007

+0

Merci beaucoup parfait . Je ne suis pas sûr de savoir pourquoi. La valeur de post n'est pas vide .... –

+0

@GrumpyCrouton, l'utilisation de variables globales est * non * recommandée. Voir https://stackoverflow.com/questions/5166087/php-global-in-functions ou https://stackoverflow.com/questions/1557787/are-global-variables-in-php-considered-bad-practice-if -so-why –

Répondre

2

mieux ne pas comparer avec des valeurs booléennes, il suffit d'utiliser

//...see below 
require_once('UserRepository.php'); 
$ur = new UserRepostory($pdo); 

if(!empty($_POST)) { 
    if (empty($username) || empty($pwood)) { 
     // something 
    } else if (!$ur->exists($_POST['username'])) { // your user_exists($pdo, $username) works fine, too 
     // something else 
    } 
} 

Surtout le if(!empty($_POST) === true) { initial est difficile à lire et conduire à la cause des erreurs de priorité des opérateurs mal compris.

Mise à jour sur la base des commentaires ci-dessus, voici un exemple avec une classe:

// UserRepository.php 
class UserRepository { 
    private $pdo; 

    // '\PDO' instead of 'PDO', see PHP Namespacing 
    public function __construct (\PDO $pdo) 
    { 
     $this->pdo = $pdo; 
    } 

    public function exists($username) 
    { 
     $sql = 'SELECT COUNT(uid) FROM users WHERE username = :username'); 
     $stmt = $this->pdo->prepare($sql); 
     $stmt->execute(['username' => $username]); 
     $result = $stmt->fetchColumn(); 

     return (bool) $result; 
    } 
} 
+0

Je peux voir comment cela a du sens. OO est un peu au-delà de mon niveau de compétence pour le moment. Je suis sûr que je reviens à cette réponse. –

+0

Comme mentionné dans le commentaire de code, la fonction sans classe fonctionne très bien et convient aussi bien aux petits projets qu'aux débutants. Il n'y a rien de mal à commencer petit, c'est juste pour montrer une "bonne" manière, et ne pas utiliser une variable globale. – clemens321

+0

Vraiment génial, j'aurais aimé pouvoir faire une deuxième mise à jour. – GrumpyCrouton