简体   繁体   中英

Count function is not working properly for sql's result

I wrote code for sign up where I check username , if it is exists in database or not than add new user accordingly. I am new to sql->prepare statement, Problem is in count function , when checking username it works properly, but in else part when adding user it gives me following error

Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, bool

Here is my adduser.php code.

<?php 

 include 'config.php';

 //checkusername

 $check = $con->prepare("select username from users where username = ?");
 $check->bindParam(1,$username);
 $username = $_POST['username'];
 $check->execute();
 $row = $check->fetch(PDO::FETCH_ASSOC);

     if(count($row)){
       echo -1;
  
     }
     
     else{

        $sql = $con->prepare("insert into users(name,username,password) values(?,?,?)");
        $sql->bindParam(1,$name);
        $sql->bindParam(2,$username);
        $sql->bindParam(3,$password);
        $name = $_POST['name'];
        $username = $_POST['username'];
        $password = md5($_POST['password']);
        $sql->execute();
            echo 1;
     }

 ?>

It doesn't make much sense to use count here, you don't need to know how many fields are in the row.

Just check if it's false or not - see php.net/manual/en/pdostatement.fetch.php which mentions that fetch() will return false when it fails (ie there is no row available).

This would make more sense:

if($row) {
    $sql = $con->prepare("insert into users(name,username,password) values(?,?,?)");
    //...etc...
}
else {
   echo -1;
}

After executing the query with $check->execute(); , you can use the built-in method to count the returned rows: $check->rowCount(); .

I think the statement above returned 0 rows, so you can't do $check->fetch() and it returns false.

Example:

// Your code here...
$check = $con->prepare("select username from users where username = ?");
$username = $_POST['username']; // This line needs to be before the next one, because you used the variable $username before defining it
$check->bindParam(1,$username);
$check->execute();
if($check->rowCount() > 0) {
  // User does exist
} else {
  // User does not exist
}

Edit 2: I just realised that the answer I've given below is wrong. The thing I suggest instead is checking if there's any value by using the PDO rowCount() method, like this: if ($check->rowCount()>0)

wrong stuff below
You're assigining $username a value after binding it.

 $check = $con->prepare("select username from users where username = ?");
 $check->bindParam(1,$username); //bind $username
 $username = $_POST['username']; //assign value
 $check->execute();

Try switching those two lines so $username is assigned a value when you're binding it.

 $check = $con->prepare("select username from users where username = ?");
 $username = $_POST['username']; //assign value
 $check->bindParam(1,$username); //bind $username   
 $check->execute();

Edit In case you're still having issues, try checking if there's any error in the sql statement execution. After your $check->execute(); you can add print_r($check->errorInfo()); to see if your MySQL statement has any issues in it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM