Miért kapok mindig 1-et a num_rows-ra?
Bejelentkezést csinálom most éppen, és a num_rowsra mindig 1-et kapok.
Login:
$login = new Login($username, $password);
class Login {
protected $username;
protected $password;
protected $connection; //Database object
public function __construct($username,$password){
//set data
$this->setData($username,$password);
//connect to db
$this->connectToDB();
//get data
$this->getData();
}
protected function setData($username,$password){
$this->username = $username;
$this->password = $password;
}
protected function connectToDB(){
$this->connection = new Database();
}
protected function getData(){
$select = $this->connection->select('SELECT * FROM users WHERE felhasznalonev = ? && jelszo = ?', array($this->username,$this->password), array('%d','%d'));
if($select != 0){
return TRUE;
}else {
return FALSE;
}
}
}
A lényeg az adatbázis osztályból: (select)
class Database extends config {
public function select($query, $data, $format)
{
// Connect to the database
$db = $this->connect();
//Prepare our query for binding
$stmt = $db->prepare($query);
//Normalize format
$format = implode('', $format);
$format = str_replace('%', '', $format);
// Prepend $format onto $values
array_unshift($data, $format);
//Dynamically bind values
call_user_func_array(array($stmt, 'bind_param'), $this->ref_values($data));
//Execute the query
$stmt->execute();
//Fetch results
$stmt->get_result();
$result = $stmt->num_rows;
return $result;
}
private function ref_values($array)
{
$refs = array();
foreach ($array as $key => $value) {
$refs[$key] = &$array[$key];
}
return $refs;
}
}
Az egyszerűség kedvéért van a database osztály, így nem kell megírni minden egyes prepared statementhez mondjuk az execute-t stb., elég ha példányosítom mondjuk a selectet. Itt meg csak 3 paramétert adok át neki.
1.Az egyik az SQL (pl.:)
SELECT * FROM tabla WHERE username = ? && jelszo = ?
2.Ezután átadom neki a ? helyére kívántat, jelenesetben:
$this->username, $this->password
3.És mivel szükség a bind_paramnál a betűkre (s, ha string, d ha decimal number), ráadásul annyira, amennyi kérdőjel van (bocs, máshogy nem tudtam megfogalmazni :D), ezért 3. paraméterként átadod neki ezeket a betűket. Jelenesetben most nem számok és kettő darab kérdőjel van, ezért ezeket adod át:
%s,%s
Majd látod is a database osztályban a select metódusnál, hogy a ezeket még implode-olja, és szépen lassan előállítja az sql lekérdezést. Így ha le akarok kérdezni valamit, csak ennyit teszek:
$database = new database();
$sql = $database->select(
"SELECT * FROM tabla WHERE username = ? && jelszo = ?",
array($this->username,$this->password),
"%s,%s");
én még a select rész leegyszerűsíteném annyival, hogy a beviteli mezőket felismertetném.
hogy szöveg, szám ... és az alapján automatikusan össze is állítanám...
Vagy ha lusta vagy, mindet kezelheted string -ként is. :-)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!