NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: PDO ovladač

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
michal Čepelák:1.9.2017 8:40

Zdravím jak u tohoto příkladu zde na itnetwork zde bych mohl použit echo pro zobrazení vložených dat.

U ovladače MYSQL jsem na to použil echo vic příklad

$sql=('select ...');
echo $sql;
die;

Děkuji za rady

 
Odpovědět
1.9.2017 8:40
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na michal Čepelák
Honza Bittner:1.9.2017 8:54

Ta tvá proměnná $sql ale obsahuje pouze dotaz v podobě textového řetězce. Abys zobrazil data, musíš nejdříve dotaz spusit, tj. v článku na to je například Db::queryAll();

Něco jako toto by tedy mohlo fungovat:

$sql= 'select ...';
$mojeData = Db::queryAll($sql);
print_r($mojeData);
Editováno 1.9.2017 8:54
Nahoru Odpovědět
1.9.2017 8:54
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Odpovídá na Honza Bittner
michal Čepelák:1.9.2017 8:57

Omlouvám se až teďka jsem si všimnul že jsem tam napsal SELECT ale má tam být INSERT
takže by to vypadalo takle

$sql=('INSERT ...');
echo $sql;
die;
Editováno 1.9.2017 8:57
 
Nahoru Odpovědět
1.9.2017 8:57
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na michal Čepelák
Honza Bittner:1.9.2017 9:21

Na pointě mého příspěvku to nic nemění.

Nahoru Odpovědět
1.9.2017 9:21
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Odpovídá na Honza Bittner
michal Čepelák:18.9.2017 10:41

Takže jestli jsem to pochopil zprávně tak by to mělo vypadat nějak takle

$sql =      Db::query('INSERT INTO servis_hw (datum,ticket,snhw,typhw,zavadahw,opravahw,opravilhw,oprcenahw) VALUES (NOW(),?,?,?,?,?,"'.$_SESSION[oprava_id].'",?)',
              $_POST['ticket'],$_POST['snhw'],$_POST['typhw'],$_POST['zavadahw'],$_POST['opravahw'],$_POST['oprcenahw'] );
$mojeData = Db::queryAll($sql);
print_r ($mojeData);

die;

chci zobrazit data co jsem odeslal do databáze
Někde tady v tom kódu ale bude chyba protože to nic nezobrazí
Děkuji

Editováno 18.9.2017 10:43
 
Nahoru Odpovědět
18.9.2017 10:41
Avatar
Odpovídá na michal Čepelák
Neaktivní uživatel:18.9.2017 13:02

Nikde chyba není, ty jsi poslal data do databáze, ale žádná jsi nedotazoval. Takže se ti vrátil prázdný result set a queryAll nejspíš vrátí prázdné pole.

Nahoru Odpovědět
18.9.2017 13:02
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
michal Čepelák:18.9.2017 13:13

Když použiju ten kód co jsem napsal nahoře s insert

$sql=('INSERT ...');
echo $sql;
die;

tak mi echo vypíše toto

INSERT INTO servis_hw (idhw,datum,tic­ket,snhw,typhw,za­vadahw,opravah­w,opravilhw,o­prcenahw) VALUE (null, NOW(), "S1214","1254­a4515","akcep­tor", "baterie","be­terie","1","1200­")

Lze udělat stejný výpis i u PDO?

Editováno 18.9.2017 13:13
 
Nahoru Odpovědět
18.9.2017 13:13
Avatar
michal Čepelák:18.9.2017 13:17

A ještě se zeptam když zadám tento kód

$sql =      Db::query('INSERT INTO servis_hw (datum,ticket,snhw,typhw,zavadahw,opravahw,opravilhw,oprcenahw) VALUES (NOW(),?,?,?,?,?,"'.$_SESSION[oprava_id].'",?)',
              $_POST['ticket'],$_POST['snhw'],$_POST['typhw'],$_POST['zavadahw'],$_POST['opravahw'],$_POST['oprcenahw'] );
$mojeData = Db::queryAll($sql);
print_r ($mojeData);

die;

tak pokud nevyplním všechny polička ve formuláři tak se mi to odešle do databáze ale pokud vyplním všechny pole tak se mi to odešle všechno do databáze OK. POuživám místní wrapper s PDO ovladačem tak nevím jestli je to wrapperem nebo jestli mám někde něco špatně já.
Děkuji

 
Nahoru Odpovědět
18.9.2017 13:17
Avatar
Odpovídá na michal Čepelák
Neaktivní uživatel:18.9.2017 13:31

Nijak jednoduše to zřejmě nelze.

Nahoru Odpovědět
18.9.2017 13:31
Neaktivní uživatelský účet
Avatar
Odpovídá na michal Čepelák
Neaktivní uživatel:18.9.2017 13:34

Nevím, co chceš. Když ty pole nevyplníš, tak budou obsahovat v případě klasických textových inputů prázdný řetězec a ten se samozřejmě bez problémů pošle do databáze. Když ty data předem neošetříš, tak se ti do databáze může dostat cokoliv.

Nahoru Odpovědět
18.9.2017 13:34
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
michal Čepelák:18.9.2017 13:43

Právě že když to pole v inputu nic nevyplním tak mi to nechce odeslat do databáze žádny data
ve wrapperu je tato funkce

public static function query($query) {
                $statement = self::executeStatement(func_get_args());
                return $statement->rowCount();

jestli to nedělá ta funkce func_get_args()

 
Nahoru Odpovědět
18.9.2017 13:43
Avatar
Odpovídá na michal Čepelák
Neaktivní uživatel:18.9.2017 13:49

Protože tam děláš nesmysly, předtím jsem si toho nevšiml. Na prvním řádku zavoláš metodu query, která provede insert a vrátí počet ovlivněných řádků, což by mělo být 1. Čeho se snažíš dosáhnout dále voláním metody queryAll? Protože do ní posíláš číslo a to zřejmě moc dobře fungovat nebude. Předpokládám, že nemáš zapnuté zobrazování errorů, tak si ho zapni, může ti pomoct.

Nahoru Odpovědět
18.9.2017 13:49
Neaktivní uživatelský účet
Avatar
michal Čepelák:18.9.2017 13:59

Při vkladání do databáze tam mám tento kód

$sql =      Db::query('INSERT INTO servis_hw (datum,ticket,snhw,typhw,zavadahw,opravahw,opravilhw,oprcenahw) VALUES (NOW(),?,?,?,?,?,"'.$_SESSION[oprava_id].'",?)',
              $_POST['ticket'],$_POST['snhw'],$_POST['typhw'],$_POST['zavadahw'],$_POST['opravahw'],$_POST['oprcenahw'] );

tam ten jsem chtěl použít pouze pro ten výpis dat
ale stejěn pokud nevyplním všechny pole ve formuláři tak se mi formulář neodešle do databaze

 
Nahoru Odpovědět
18.9.2017 13:59
Avatar
Lasvit
Člen
Avatar
Odpovídá na michal Čepelák
Lasvit:22.9.2017 11:55

Jinak,

  1. Vynech zdejší wrapper a nauč se nejdřív používat základ PDO at víš o co tam go, je vidět, že nějak nechápeš základní komunikaci s DB pomocí PDO.
  2. Nauč se jak funguje DB s unique, not null atd.
  3. Zapni si výpis chyb a zkus to opravit podle nich

Pokud to všechno uděláš hned pochopíš kde děláš celou dobu chybu... dokonce i bez pomoci :)

 
Nahoru Odpovědět
22.9.2017 11:55
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na michal Čepelák
Jirka Jr:22.9.2017 14:34

tak nejdriv je si treba rict, jak databazi rict, ze chceme ten jeden konkretni radek

pokud jses si 100% jisty, ze treba sloupec ticket je vzdy pro kazdy radek jiny, tak muzes treba takto:

$pocet_radku = Db::query("INSERT INTO servis_hw (datum,ticket,snhw,typhw,zavadahw,opravahw,opravilhw,oprcenahw) VALUES (NOW(),?,?,?,?,?,'".$_SESSION[oprava_id]."',?)",
              $_POST['ticket'],$_POST['snhw'],$_POST['typhw'],$_POST['zavadahw'],$_POST['opravahw'],$_POST['oprcenahw'] );

if($pocet_radku > 0) {
    $mojeData = Db::queryOne("SELECT datum,ticket,snhw,typhw,zavadahw,opravahw,opravilhw,oprcenahw FROM servis_hw WHERE ticket=?", $_POST['ticket']);
    var_dump($mojeData);
} else {
   echo '</p style="color:red">Chyba pri ukladani dat do db.</p>';
}

die;

pokud bys do tabulky pridal sloupec id typu INT, s atributem autoincrement, aby se pri vlozeni radku automaticky vlozilo unikatni id radku, tak treba takto:

$pocet_radku = Db::query("INSERT INTO servis_hw (datum,ticket,snhw,typhw,zavadahw,opravahw,opravilhw,oprcenahw) VALUES (NOW(),?,?,?,?,?,'".$_SESSION[oprava_id]."',?)",
              $_POST['ticket'],$_POST['snhw'],$_POST['typhw'],$_POST['zavadahw'],$_POST['opravahw'],$_POST['oprcenahw'] );

if($pocet_radku > 0) {
    $id = DB::getLastId();
    $mojeData = Db::queryOne("SELECT datum,ticket,snhw,typhw,zavadahw,opravahw,opravilhw,oprcenahw FROM servis_hw WHERE id=?", $id);
    var_dump($mojeData);
} else {
   echo '</p style="color:red">Chyba pri ukladani dat do db.</p>';
}
 
Nahoru Odpovědět
22.9.2017 14:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.