Kezdőoldal » Számítástechnika » Weblapkészítés » PHP-ban PDO lekérdezés eredmén...

PHP-ban PDO lekérdezés eredménye kiírása hogyan lehetséges?

Figyelt kérdés

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.



2015. febr. 15. 16:23
 1/4 anonim ***** válasza:

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;

}

}

2015. febr. 15. 17:32
Hasznos számodra ez a válasz?
 2/4 A kérdező kommentje:

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.

2015. febr. 15. 22:30
 3/4 anonim ***** válasza:

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.

2015. febr. 20. 04:27
Hasznos számodra ez a válasz?
 4/4 anonim ***** válasza:

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'))

2015. febr. 20. 04:29
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!