Diskuze: PDO ovladač
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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);
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;
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
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.
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,ticket,snhw,typhw,zavadahw,opravahw,opravilhw,oprcenahw) VALUE (null, NOW(), "S1214","1254a4515","akceptor", "baterie","beterie","1","1200")
Lze udělat stejný výpis i u PDO?
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
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.
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()
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.
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
Jinak,
Pokud to všechno uděláš hned pochopíš kde děláš celou dobu chybu... dokonce i bez pomoci
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>';
}
Zobrazeno 15 zpráv z 15.