Zadejte hledaný výraz...

Bezmoc, prázdné proměnné v PHP

David Musil
verified
rating uzivatele
(69 hodnocení)
14. 4. 2016 10:13:15
Asi už mám dost, napadá někoho, proč mi nejde tenhle easy kód?
V kontrolním výpisu pod echem jsou všechny hodnoty uložené správně. Ale ten SQL dotaz prostě ukládá jen prázdné řetězce. Dokonce, když $price a $term nenačítám z toho POSTu, ale přiřadím hodnotu ručně, uloží je srávně s obsahem. POST je naplněn, to dokazuje i ten kontrolní výpis. Ale do DB se ta hodnota prostě nedostane, ani kdybych se na hlavu postavil.
Sloupce v DB a všecko ostatní sedí, nikde není chyba. Když ten obsah vložím ručně, opravdu to propisuje hodnoty do DB. Fakt nevím...
for ($i = 1; $i <= 12; $i++) {
$price = $_POST;
$term = $_POST;
echo $i . '-' . $price . '--' . $term . '
';
$sql = $db->query("UPDATE " . TABLE . " SET price = "$price", term = "$term" WHERE id = "$i"");
}
14. 4. 2016 10:13:15
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189532
sh
verified
rating uzivatele
(22 hodnocení)
14. 4. 2016 10:23:04
co debug? mysql_query(...) or die(mysql_error())
a ty " jdou divny treba pouzij apostrofy
14. 4. 2016 10:23:04
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189531
Taps
verified
rating uzivatele
(118 hodnocení)
14. 4. 2016 10:38:08
14. 4. 2016 10:38:08
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189530
protected
verified
rating uzivatele
(13 hodnocení)
14. 4. 2016 10:39:49
dej si echo toho mysql dotazu a pak ho ručně dej do mysql třeba přes phpmyadmin. zjistíš chybový stav
14. 4. 2016 10:39:49
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189529
Zkus sem vypsat celý řetězec, který se posílá do DB. Tedy již s nahrazenými proměnnými za konkrétní data.
Moje tipy:
- špatně napsaný název tabulky, sloupců
- v předaných datech, která jsou neošetřená, je znak, který ti ukončuje nastavovanou hodnotu jedné z proměnných
Případně sem napiš kód chyby nebo celou chybovou hlášku. Něco ta databáze na tento dotaz určitě vrátí.
14. 4. 2016 10:42:25
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189528
tomve
verified
rating uzivatele
(22 hodnocení)
14. 4. 2016 11:11:11
Pokud je to PDO (http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers):
$db->query() = určeno hlavně pro čtení dat z db s pevnými parametry, sice lze narvat proměnne, ale hrozí sql injection + ty apostrofy a escapace (sice expert Aleš Jiříček by měl kécy, ale nevidím ho zde) jsou kapek mimo - apostrofy " v php pro sql ruší řetězec. (Osobně jsem v mysql_query psal SET abc = ' ".$abc." ' (bez mezer, jednoduchý je vkladání hodnoty a double je pro aktivní proměnnou) a vždy jelo. <-- pokud to není pdo, tak to bude v tomto.)
Pro práci s proměnnými s db v PDO je určen
$sql = $db->prepare(dotaz)
$sql->execute(array("hodnoty"))
Nehrozí sql injection, pač si to pdo samo ošetří.
+
I názvy těch POST poli jsou mi proti srsti, radši
---------- Post added 14.04.2016 at 11:22 ----------
++
Kdyby to bylo fakt PDO, tak ti tam chybí $sql->execute();
Ale takhle člověk neví, co to je.
14. 4. 2016 11:11:11
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189527
1. Zapni si chybové hlášky včetně notices, řeknou ti, když proměnná neexistuje.
2. Obligátní připomínka: Kód není zabezpečený vůči SQL injection.
14. 4. 2016 11:51:25
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189526
David Musil
verified
rating uzivatele
(69 hodnocení)
14. 4. 2016 11:52:54
Ne fakt nejaka zahada a fakt nevim, kde uz co menit.
Vypsane SQL je OK. Hodnoty jsou vsechny spravne, jen to proste vklada jen prazdny retezec. A kdyz si ho pred dotazem vypisu pro kontrolu, je v nem obsah. Sloupce nastaveny v DB take spravne. Nevim..
Bezpecnost kodu me netrapi, je to takova moje vecicka na localhostu, nikdo k tomu nikdy pristup mit nebude.
Ono je to proste tak, ze tam propisuje porad prazdnej retezec...
Prece neni mozny vypsat promennou s obsahem, aby o radek nize byla ukladana jako prazdnej retezec, kydz v ni je evidentne obsah :/
EDIT: tak to bude pruser uplne nekde jinde, protoze nezapisuje jedinou promennou prevzatou z $_POST - ta promenna ale existuje a je naplnena. Jakmile ji ale predam k vypisu, tak se vypise. Jakmile ji predam SQL dotazu, ten zapise prazdny retezec, i kdyz po vypsani celeho SQL ma spravny obsah vcetne promenne.
14. 4. 2016 11:52:54
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189525
Pivel
verified
rating uzivatele
14. 4. 2016 12:34:20
Možná to bude znít jako pitomost, ale zkontroluj si v databázi, že sloupce mají správný typ... občas rychle dělám tabulku a omylem nechám někde int místo varcharu a když do toho pošlu znaky tak mi to tam logicky nacpe nuly...
14. 4. 2016 12:34:20
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189524
David Musil
verified
rating uzivatele
(69 hodnocení)
14. 4. 2016 12:41:22
Napsal Pivel;1284805
Možná to bude znít jako pitomost, ale zkontroluj si v databázi, že sloupce mají správný typ... občas rychle dělám tabulku a omylem nechám někde int místo varcharu a když do toho pošlu znaky tak mi to tam logicky nacpe nuly...
Kdepak, to jsou prvni veci, ktery kontroluji. Tam to necpe, jsou to retezce varchar a zustavaji prazdne.
14. 4. 2016 12:41:22
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189523
David Musil
verified
rating uzivatele
(69 hodnocení)
14. 4. 2016 12:53:39
Tohle prece neni ani logicky mozny!
print_r($_POST); //naplneno OK
for ($i = 13; $i <= 24; $i++) {
$priceNew = $_POST; //***
$termNew = $_POST ; //***//***
echo $priceNew . '-' . $termNew; //OK, opet napleneno spravne
$sql2 = $db->query("UPDATE " . TABLE . " SET price = "$priceNew", term = "$termNew" WHERE id = "$i""); //a nic se nestane
*** az kdyz promennou zretezim treba takto $termNew = $_POST .5; tak se zapise to posledni cislo, nyni 5
}
14. 4. 2016 12:53:39
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189522
Co ti vypíše?
14. 4. 2016 13:43:46
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189521
David Musil
verified
rating uzivatele
(69 hodnocení)
14. 4. 2016 13:51:21
Napsal vytvorweb.cz;1284821
Co ti vypíše?
UPDATE pricelist SET price = "1990", term = "duben" WHERE id = 1
Treba toto
14. 4. 2016 13:51:21
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189520
Takže to vypadá, že SQL dotaz je v pořádku. Zbývá tedy zjistit:
- co dělá funkce $db->query(), nedělá nějaký ošetření SQL dotazu?
- jaký typ mají sloupce price a term?
- není nad tabulkou nějaký zapomenutý unikátní index? (price, term)
- co udělá dotaz v phpmyadminu?
14. 4. 2016 13:57:19
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189519
To jako fakt strkáš $_POST přímo do SQL dotazu? Až web spustíš, dej mi vědět. Rád ti pak pošlu celou databázi ;-)
---------- Příspěvek doplněn 07.05.2016 v 13:47 ----------
Zkus to přepsat do PDO například takto:
define('DATABASE_NAME', 'nazev_databaze');
define('DATABASE_HOST', 'localhost');
define('DATABASE_USERNAME', 'uzivatel_databaze');
define('DATABASE_PASSWORD', 'heslo_databaze');
$pdo = new PDO(sprintf('mysql:dbname=%s;host=%s', DATABASE_NAME, DATABASE_HOST), DATABASE_USERNAME, DATABASE_PASSWORD);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
for ($i = 1; $i <= 12; $i++) {
// získání z $_POST pokud opravdu existují, jinak nastavíme na 'undefined'
$price = array_key_exists('price_'.$i, $_POST) ? $_POST : 'undefined';
$term = array_key_exists('term_'.$i, $_POST) ? $_POST : 'undefined';
// ověření, zda proměnné obsahují data
var_dump(sprintf(
'Iterace č.: %s; Cena: %s; Term: %s',
$i, $price, $term
));
$sql = sprintf(
'UPDATE %s SET price = ?, term = ? WHERE id = ?',
'NazevTvojiTabulky'
);
var_dump($sql);
try {
$pdo->beginTransaction();
$stmt = $pdo->prepare($sql);
$result = $stmt->execute(array($price, $term, $i));
var_dump(sprintf(
'Výsledek dotazu: %s',
$result === true ? 'ok' : 'fail'
));
var_dump(sprintf(
'Počet ovlivněných řádků: %s',
$stmt->rowCount()
));
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
var_dump($e->getMessage());
break;
}
}
7. 5. 2016 00:48:51
https://webtrh.cz/diskuse/bezmoc-prazdne-promenne-v-php/#reply1189518
Pro odpověď se přihlašte.
Přihlásit