Black friday Black friday
Pouze tento týden až 80% sleva na PHP, Nette, Symfony!
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací

Diskuze: Nejde mi zapsat PHP proměnná do Mysql Datábáze

PHP PHP Nejde mi zapsat PHP proměnná do Mysql Datábáze American English version English version

Aktivity (1)
Avatar
Jan Straka
Člen
Avatar
Jan Straka:3. února 7:59

Tak nejde mi zapsat třeba proměnná :-(

$username

a další do mysql databáze,používám funkci mysqli.Můžu vám to ukázat na tomhle kodu:

$conn = mysqli_connect("localhost","root","heslo","beelinfo");

  $sql = 'INSERT INTO accounts ("id", "username", "password", "bgcolor", "email") VALUES (NULL, "{$username}", "{$passhash}", "#9112b7", "{$email}")';


$result = mysqli_query($conn,$sql);

Zkusil jsem: Ještě jsem zkoušel

$sql = 'INSERT INTO accounts ("id", "username", "password", "bgcolor", "email") VALUES (NULL, ".$username.", ".$passhash.", "#9112b7", ".$email.")';
:-X

Chci docílit: Snažím se udělat sociální sít pro programátory a udělat komepetivní programování které se bude projevovat rankem uživatele. :-)

 
Odpovědět 3. února 7:59
Avatar
Odpovídá na Jan Straka
Michal Štěpánek:3. února 9:24

Jsi si jistý, že tam místo ID máš dosadit "NULL"? K čemu by pak to ID bylo, kdyby všechny záznamy měly ID null? Nevím, jak v MySQL, ale u klasického SQL se to ID v INSERT dotazu ani neuvádí...

Editováno 3. února 9:27
Nahoru Odpovědět  +1 3. února 9:24
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Zdeněk Srb
Člen
Avatar
Odpovídá na Jan Straka
Zdeněk Srb:3. února 9:26

A vrací to nějaký error? Jinak bych zkusil dát nějakou hodnotu do toho id, pokud to máš jako primární klíč tak ukládat to s null nedává moc smysl, dále bych vyhodil mysqli a přečetl si tady na webu jako pracovat s PDO a začal ho používat.

 
Nahoru Odpovědět 3. února 9:26
Avatar
Jan Straka
Člen
Avatar
Odpovídá na Zdeněk Srb
Jan Straka:3. února 9:54

Hází to errory jen v phpmyadmin nolovy řádek se vrátil.PDO jsem zkoušel tam to samé.

 
Nahoru Odpovědět 3. února 9:54
Avatar
Václav Methez:3. února 12:09

ID do dotazu nevyplňuj jen v případě že más v phpmyadmin zaškrtunté AUTO_INCREMENT u id. Ten se postará že každý záznam dostane (pořadové) číslo.

 
Nahoru Odpovědět 3. února 12:09
Avatar
Odpovídá na Jan Straka
Michal Šmahel:3. února 12:23

Ahoj, vyzkoušej tohle a napiš, k čemu jsi došel. Použiji poznámky Michal Štěpánek a Zdeněk Srb.

  • Když se vkládá záznam do databázové tabulky ID, které je AUTO_INCREMENT, se vynechává. Jak již bylo psáno, nulová hodnota je i nelogická - ID hodnotu mít musí a dokonce unikátní. Ze svého dotazu jej tedy odstraň.
  • Vypiš si proměnnou $sql pomocí funkce var_dump(). Tak zjistíš, jestli je dotaz sestaven správně.
  • Zkopíruj vypsaný dotaz a vyzkoušej jej v PHPMyAdmin nebo MySQL konzoli (terminálu). Sleduj výsledek - výstupní hlášku. Poté zkontroluj tabulku, jak se změnila (data, AUTO_INCREMENT).
  • Pokud to nebude fungovat, sestav si dotaz v PHPMyAdmin do funkční podoby a následně ho jen uprav pro vkládání dat PHP.
  • Přemýšlej nad SQL injection, je to vážný problém. Přečti si o možnosti nepřímého předávání dat pomocí předpřipravených dotazů (prepared statements).
Nahoru Odpovědět 3. února 12:23
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Jan Straka
Člen
Avatar
Odpovídá na Michal Šmahel
Jan Straka:3. února 12:38

SQL Injection můžu vyřešit před publikaci webu na server.Umí **var_dump() ** i předělat příkaz na správný?

 
Nahoru Odpovědět 3. února 12:38
Avatar
Odpovídá na Jan Straka
Michal Šmahel:3. února 12:45

No, na to bych nespoléhal. Až se ti projekt rozroste, nebudeš ani vědět, kde dotazy máš.

Var_dump() je debuggovací funkce. Umí jen vypisovat obsahy proměnných a nějaké doplňující informace k tomu.

Nahoru Odpovědět 3. února 12:45
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Jan Straka
Člen
Avatar
Odpovídá na Michal Šmahel
Jan Straka:3. února 12:46

dobře napsal ti zprávu co mi ten var_dump() udělal.

 
Nahoru Odpovědět 3. února 12:46
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4. února 12:16

http://php.net/…e-string.php
Zabezpeceni proti sql injekci

$query = "... WHERE string='%s' AND digit=%d";
$query = sprintf($query, mysqli_real_escape_string($value1), $value2);

Nebo se da pouzit vsprintf pro array.

  • mysqli_real_es­cape_string by mel odstranit z retezce parazitni znaky. U cisla to neni nutne %d by si melo prevest samo hodnotu na cislo.

Jan Straka - Tomu, co pises vubec nerozumim. Pis celou vetou, nevynechavej pro tebe jasne formulace. Zkusim popsat jinymi slovy, co ti napsali uz oba Michalove.

  1. Podle toho, co mas v prvni zprave tipuji, ze se pokousis prepisovat INSERTEM sloupec id, ktery mas nastaveny jako AUTOINCREMENT v tabulce. Pokud vkladas novy zaznam do tabulky na konec, sloupec id v insertu neuvadis. Tvuj puvodni dotaz je pouzitelny jedine v pripade prazdne tabulky.
  2. Pokud je sloupec v tabulce nastaveny jako index typu AUTOINCREMENT DEFAULT NOT NULL, neni mozne do nez davat NULL hodnotu. (Je mozne, ze v nejakem typu ci verzi sql takovou chybu ignoruje a presto ti prida novy radek, ale asi ne zrovna ve tvem.)
 
Nahoru Odpovědět 4. února 12:16
Avatar
Odpovídá na Jan Straka
Michal Štěpánek:4. února 12:21

Upravovat dotazy až před publikací na server je ta nejhorší možná varianta. Programuj správně hned "napoprvé" a nemusíš pak nic upravovat, abys to ochránil proti možným útokům. Při publikaci si totiž nemusíš vzpomenout na všechny vložené příkazy a až ti někdo tvou práci zničí, kvůli jednomu zapomenutému "neupravenému" dotazu, budeš se tlouct do hlavy a rvát si vlasy za zbytečně ztracený čas, protože jsi to nenapsal správně rovnou...

Nahoru Odpovědět  +1 4. února 12:21
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4. února 12:23
  1. Naus se psat sql / php stringy. Idealne si vygoogluj priklady. Mas tam uplne spatne uvozovky

google = mysqli php query example
php "..." string, \" nebo ', "...\"...'..."
php '...' string, " nebo \', '..."...\'...'
"..."..." - tohle je nesmysl, protoze druha uvozovka ukoncuje string a ta cast za ni bude oznacena za error
sql "...sloupec..." zpetna uvozovka, u klavesy Q nebo 1
sql string "...'text'..."
sql cislo "...123..."

 
Nahoru Odpovědět 4. února 12:23
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Michal Štěpánek
Peter Mlich:4. února 12:27

To mas marne. Ucitel jim ve skole ukazuje kody co nejvic zjednodusene. Coz pak vede k tomu, ze je novacku pln forum a ptaji se na uplne zaklady, ktera ta zdanlive slozitejsi konstrukce resi.
Treba u nas do dneska neakceptovali utf kodovani pro sql tabulky. Stale ukladaji ve w1250. Nabizel jsem jim, ze jim programy upravim pro utf tabulky. Odmitly. :)

 
Nahoru Odpovědět 4. února 12:27
Avatar
Jan Straka
Člen
Avatar
Odpovídá na Peter Mlich
Jan Straka:4. února 17:56

string(191) "INSERT INTO accounts ( username, password, bgcolor", email) VALUES ( "admin", "8c6976e5b541­0415bde908bd4de­e15dfb167a9c873fc4bb8a81­f6f2ab448a918", "#9112b7", "[email protected]­nam.cz") tohle mi to udělalo když jsem použil var_dump() na escapováný uživatelský input

 
Nahoru Odpovědět 4. února 17:56
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Jan Straka
Peter Mlich:5. února 11:36

var_dump neni echo a prohlizec - zobrazit zdrojovy kod.
Nicmene, ten sql dotaz ma temer vsechny uvozovky spatne, si myslim. Jak jsem psal, u sloupcu tabulek se pouzivaji zpetne jednoduche. Ty tam mas dvojite. To jsem nikdy nezkousel, ale domnivam se, ze to nebude fungovat. Zkus si najit par prikladu googlem.
google = sql query example

 
Nahoru Odpovědět 5. února 11:36
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.