PHP-ban PDO lekérdezés eredménye kiírása hogyan lehetséges?
Adott az alábbi kód egy login.php nevű fájlban:
$usernamequery = $connect->prepare('SELECT username FROM users WHERE email= :email');
$usernamequery->bindParam(':email', $email, PDO::PARAM_INT);
$usernamequery->execute();
foreach($usernameresult = $connect->query($usernamequery) as $usernamename){
$_SESSION['username'] = $username['username'];
}
És az alábbi kód az index.php nevű fájlban:
echo $_SESSION['username'];
Erre ezt a hibaüzenetet kapom:
Notice: Undefined index: email in ... line ...
Mi lehet a gond? Szerertném lekérdezni a useres táblából a username-eket, majd a bejelentkezés után kiírni.
Hát inkább odaadom az általam írt osztályt.
Egyszerű használni. Csak példányosítod az adott adatok alapján. dns, user, pass.
prepare methódusában odaadod az SQL-t "?"-jelesen
Pl.: "SELECT * FROM `alma` WHERE `aa` = ? AND `bb` = ?"
majd hívod az execute methódust.
Ő egy tömböt vár, aminek array("elso-?-jel-erteke", "masodik-?-jel-erteke");
Ha nincs "?" jeled, akkor egyszerűen ...->execute();
Ha SELECT-et kap akkor egy 2dimenziós tömbbel tér vissza
$result['oszlopneve']['szorszama'] koordinátákkal éred el.
Persze, ha SQL hibát generál, az generál egy Exception-t szóval azt le kell kezelni. :)
----------------------------------------------
<?php
class DataBaseConnect extends PDO {
private $Statement;
public function __construct($dsn, $user, $password) {
try {
parent::__construct($dsn, $user, $password);
$this->prepare("SET CHARACTER SET utf8")->execute();
$this->prepare("SET NAMES utf8")->execute();
}
catch(PDOException $e) {
throw new PDOException("Database connect error: ".$e->getMessage(), $e);
}
}
public function prepare($sql, $nameParam = FALSE) {
if($nameParam === TRUE) {
$this->Statement = parent::prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
} else {
$this->Statement = parent::prepare($sql);
}
return $this;
}
public function execute($param = []) {
try {
if(empty($param)) {
$this->Statement->execute();
return $this->sqlRun();
} else {
$this->Statement->execute($param);
return $this->sqlRun();
}
} catch(SQLException $exc) {
return [];
}
}
private function sqlRun() {
$this->errorCheck();
if(preg_match('#^SELECT#', $this->getQueryString())) {
return $this->Statement->fetchAll();
}
return [];
}
private function errorCheck() {
if($this->Statement->errorCode() !== '00000') {
$info = $this->Statement->errorInfo();
throw new SQLException($info[0].'|'.$info[1].'|'.$info[2].'|'.$this->getQueryString());
}
}
public function rowCount() {
return $this->Statement->rowCount();
}
public function getQueryString() {
return $this->Statement->queryString;
}
}
Köszönöm szépen a választ!
Hát nem gondoltam, hogy ilyen "bonyolultan" is le lehet valamit kérdezni. Az általad írt kódod még elemeznem kell, sok minden nem világos benne.
Régen egy sima Mysql-ben nem okozott ekkora problémát egy lekérdezés, most meg már a 3. napja tart és nem jön össze.
Legyen az alábbi tábla A és B oszlop névvel, és mind a 2 oszlop tartalmaz 3 sort.
Fektetve így nézne ki.
Tabla
-----------
A | 11 22 33
B | dd ee ff
Nos PHP oldalon 1. példányosítanod kell az osztályt pdo-s adatokkal. (A php kódokat "php>"-val fogom jelölni)
php> $DB = new DataBaseConnect(<kapcsolati DNS>, <felhasz>, <jelszó>);
Ez létre lefuttatja a __construct-tot, ami megprobál a PDO-t csatlakoztatni az adatbázishoz. Ha nem sikerül neki visszadob egy PDOException-t. Ha igen, akkor UTF-8-ra beállítja a karakter készletet, hogy ne legyen probléma az ékezetes és egyébb karakterekkel.
Ezekután kíváncsi vagy, hány sort tartalmaz a fenti tábla. Ezt több módon is megtudod tenni
1)
php> $DB->prepare("SELECT * FROM Tabla")->execute();
php> echo $DB->rowCount();
vagy 2)
php> $visszateres = $DB->prepare("SELECT COUNT(*) AS 'count' FROM Tabla")->execute();
php> echo $visszateres['count'][0];
Vagy te csak az ee és ff sort akarod kinyerni, és arra vagy kíváncsi, hogy milyen számok szerepelnek:
php> $visszateres = $DB->prepare("SELECT A FROM Tabla WHERE B = ? OR B = ?")->execute(array('ee', 'ff'));
A $visszateres lényegében egy ilyennel lesz: array('A' => array('22', '33'))
php> $visszateres = $DB->prepare("SELECT * FROM Tabla")->execute();
A $visszateres lényegében egy ilyennel lesz:
array('A' => array('11', '22', '33'), 'b' => array('dd', 'ee', 'ff'))
Oszlop neve (String) és String indexű => Sorok tartalma (String), de integer indexű
SELECT helyett INSERT, DELETE, UPDATE esetén mindig üres tömbbel tér vissza, mert akkor ugye nincs mit visszadjon.
Az execute paramétere egy tömb. De a tömb elemei a ? jeleknek megfelelően kell sorban lennie.
Azaz ha több ? jeled van, annyi eleműnek kell lennie a tömbnek amit odaadsz az execute-nak.
Továbbá, ha elrontottál valami SQL lekérdezést, akkor az execute() egy SQLException-el tér vissza, és a MySQL szerver által generált hibaüzenettel.
sqlRun() és a errorCheck() metódusokkal meg ne foglalkoz, mert private-ak. :) Azokat nem tudod hívni.
Ez helyett:
array('A' => array('11', '22', '33'), 'b' => array('dd', 'ee', 'ff'))
Ez:
array('A' => array('11', '22', '33'), 'B' => array('dd', 'ee', 'ff'))
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!