Second Opinion
Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale. Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit. www.neurohope.ro |
Mysqli_fetch_array - nu pot extrage id-urile randurilor
Last Updated: Jul 04 2013 21:57, Started by
neotester
, Jul 03 2013 07:50
·
0
#1
Posted 03 July 2013 - 07:50
Salutare tututor,
Incerc sa ma conectez la baza de date si sa gasesc id-ul ultimului rand din tabela "shop_categories", urmand ulterior sa-l introduc in "shop_subcategories". Ei, acel ID extras prin mysqli_fetch_array nu reusesc sa-l introduc in "shop_subcategories". De fiecare data cand ma uit in phpmyadmin sa vad ce efect a avut codul, "main_category_id" este 0 de fiecare data. Nu reusesc sa-mi dau seama cum sa pun acele ghilimele si apostrofuri din query-ul de inserare. Imi puteti sugera vreo abordare? $conectare_baza=new mysqli("localhost","user","pass","database"); $interogare="select * from shop_categories"; $rand = mysqli_fetch_array($conectare_baza, MYSQLI_NUM); $conectare_baza->query("Insert into shop_subcategories (subcategory, subcategory_url, subcategory_parent_id, subcategory_details,main_category_id) values ('$category', '$category_url', 0, '$details','$rand['id']')"); Multumesc. |
#3
Posted 03 July 2013 - 08:19
sorin147, on 03 iulie 2013 - 08:05, said:
escape characters ajuta? \' \" $db->query("Insert into shop_subcategories (main_category_id) values ('".$rand[ \'id\']."')");si primesc: Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting T_STRINGcee ce ar sugera ca nu sunt bine puse. Ce-mi scapa, mai exact? Nu folosesc aceste backslash-uri corespunzator? Edited by neotester, 03 July 2013 - 08:20. |
#4
Posted 03 July 2013 - 08:26
$conectare_baza->query("Insert into shop_subcategories (subcategory, subcategory_url, subcategory_parent_id, subcategory_details,main_category_id) values ('$category', '$category_url', 0, '$details','{$rand['id']}')");Daca ai un query in interiorul ghilimelelor se accepta doar variabile. Prin $rand['id'] tu de fapt accesezi o proprietate a variabilei. La o simpla cautare pe google dupa "using array inside double quotes" am gasit asta: http://www.sitepoint...e-double-quotes Exact acelasi subiect ca al tau. Retine: Un bun programator nu este ala care stie sintaxa pe dinafara, ci ala care stie sa caute pe goagal Daca stii ce sa cauti si folosesti zilnic aceleasi tipuri de structuri vor deveni automatism. |
#5
Posted 03 July 2013 - 08:34
1)
main_category_id e un INT nu? La fel si subcategory probabil. Deci nu ai nevoie de ghilimele. "Insert into shop_subcategories (subcategory, subcategory_url, subcategory_parent_id, subcategory_details,main_category_id) values ($category, '$category_url', 0, '$details',$rand['id'])" 2) Folosesti "magic quotes" ca sa construiesti string-uri. Opreste-te. Ajungi in situatii in care PHP ar trebui sa interpreteze accesul intr-un array ($rand['id']), si spun interpreteze pentru ca $rand['id'] e un string acolo, nu o variabila, si ar putea sa functioneze (cu sintaxa corecta) doar pentru ca exista magic quotes. Sintaxa corecta e $rand[id], nu $rand['id'], sau, mult mai bine, {$rand['id']}. Dar query-ul ala trebuia sa-l construiesti cu concatenari de string-uri, nu cu magic quotes. Niciodata magic quotes. Mai bine le si dezactivezi din php.ini. 3) Foloseste mysqli sau PDO si bind parameters. Codul tau ar putea arata cel putin asa: $query = 'INSERT INTO shop_subcategories (subcategory, subcategory_url, subcategory_parent_id, subcategory_details,main_category_id) values (?, ?, ?, ?, ?)'; $db->query($query, array( $category, $category_url, 0, $details, $rand['id'] )); |
#6
Posted 03 July 2013 - 08:40
DarkAngelBv, on 03 iulie 2013 - 08:26, said: $conectare_baza->query("Insert into shop_subcategories (subcategory, subcategory_url, subcategory_parent_id, subcategory_details,main_category_id) values ('$category', '$category_url', 0, '$details','{$rand['id']}')");Daca ai un query in interiorul ghilimelelor se accepta doar variabile. Prin $rand['id'] tu de fapt accesezi o proprietate a variabilei. La o simpla cautare pe google dupa "using array inside double quotes" am gasit asta: http://www.sitepoint...e-double-quotes Exact acelasi subiect ca al tau. Retine: Un bun programator nu este ala care stie sintaxa pe dinafara, ci ala care stie sa caute pe goagal Daca stii ce sa cauti si folosesti zilnic aceleasi tipuri de structuri vor deveni automatism. $db->query("Insert into shop_subcategories (main_category_id) values ('{$rand[id]}')"); si $db->query("Insert into shop_subcategories (main_category_id) values ('{$rand['id']}')");si $db->query("Insert into shop_subcategories (main_category_id) values ('".{$rand[id]."}')"); dar main_category_id este populat tot cu zero. |
#7
Posted 03 July 2013 - 08:55
Pai stai asa, ca tu nu faci query la baza de date.
Trebuie sa ai mysql_connect rezultat = mysql_query rand = mysql_fetch_array(rezultat) |
#8
Posted 03 July 2013 - 09:00
@sergiu_spooky: "bind paramameters" - cea mai buna modalitate de a preveni SQL Injection, eveniment de care ar fi bine sa ma feresc in orice dezvolt pentru ca o baza de date mi-a fost compromisa prin Sql Injection.
Cat despre cod, e prima oara cand intalnesc "formatul" acesta, cel in care se utilizeaza "bind paramaters" insa, nu-mi functioneaza: SQL/DB Error -- [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?, ?, ?, ?, ?)' at line 1]. Ok. Nu reuseste sa interpreteze valorile pentru aceste semne de intrebare, cred, intr-un fel. Am schimbat si ghilimelele intre ele (cele de la query-ul in sine cu cele ale randid]-ului) si tot aceeasi problema. |
#9
Posted 03 July 2013 - 09:01
Altfel spus, unde folosesti variabila $interogare?
Edit: codul pus de mine nu e "standard". Presupune ca $db e instanta unei clase scrise de tine care in metoda query foloseste (presupunand ca e mysqli) asa ceva. Daca te uiti aici o sa vezi ca nicaieri in sintaxa nu apare un array ca parametru (cum ziceam, codul propus de mine are in spate o clasa DB, cam asa ceva, dar intr-o clasa). Edit: nu folosesti bind parameters ca sa scapi de SQL injection. Asta e un side-effect util. Folosesti pentru a scrie cod PHP usor de citit/inteles/mentinut (Ceva ce lipseste cu desavarsire in codul tau. Problema ta a aparut tocmai pentru ca folosesti magic quotes, care sunt greu de citit/inteles/mentinut cand ajungi sa ai {$ceva[altceva]} in ele.). Poti rezolva problema SQL injection si altfel, nu doar cu bind parameters. Edit: niciuna din variantele incercate de tine nu e inca corecta. Insert into shop_subcategories (main_category_id) values ('{$rand[id]}')Din moment ce main_category_id e INT, de ce ar avea nevoie de ghilimele? In plus, ai dat un var_dump($rand) sa vezi ce e in el? Pe baza faptului ca nu vad nicaieri sa folosesti $interogare in codul tau, presupun ca $rand e NULL. Edit: $db->query("Insert into shop_subcategories (main_category_id) values ('".{$rand[id]."}')");Asta nici macar nu ruleaza. Ori faci $db->query("Insert into shop_subcategories (main_category_id) values ({$rand[id]})"); ori $db->query('Insert into shop_subcategories (main_category_id) values (' . $rand['id'] . ')'); |
#10
Posted 03 July 2013 - 09:01
DarkAngelBv, on 03 iulie 2013 - 08:55, said:
Pai stai asa, ca tu nu faci query la baza de date. Trebuie sa ai mysql_connect rezultat = mysql_query rand = mysql_fetch_array(rezultat) $conectare_baza=new mysqli("localhost","user","pass","database"); $interogare="select * from shop_categories"; |
|
#11
Posted 03 July 2013 - 09:11
Pai queryul $interogare="select * from shop_categories";, unde il executi tu ?
Edited by Raster02, 03 July 2013 - 09:17. |
#12
Posted 03 July 2013 - 09:20
Tocmai. Tu iti declari interogarea, dar nu o apelezi niciunde.
|
#13
Posted 03 July 2013 - 10:30
Ok. Devine confuz acest topic atat pentru mine cat si pentru voi, cei care ma ajutati. Prin urmare, reiau problema mea.
Am 2 tabele: shop_categories cu urmatoarele campuri:
Problema generala este eu modific un CMS si-mi e putin mai greu sa-mi dau seama cum a fost gandit. Asa ca... poate deveni frustrant sa incerc sa-l imbunatesc. Acum, CMS-ul foloseste foarte des expresii de genul $db->query("select *... si m-am hotarat sa merg pe aceeasi "directie" oarecum. Ok. Pentru a-mi afisa acest ID din shop_categories, in mintea mea, ca "procedura" fac astfel: selectez tot din tabela shop_categories, le pun intr-un tablou ("array"), extrag id-ul ("$row['id']) iar apoi il inserez in shop_subcategories, mai exact in main_category_id. Transpus in cod, folosesc: $interogare="select * from shop_categories"; $rand = mysqli_fetch_array($interogare); $db->query("select * from shop_subcategories"); $db->query("Insert into shop_subcategories (main_category_id) values ({$rand[id]})"); insa, nu am succes: SQL/DB Error -- [Column count doesn't match value count at row 1] @DarkAngelBv, @Raster02: intr-adevar nu executam nici un query care sa se foloseasca de variabila $interogare. |
#14
Posted 03 July 2013 - 10:40
Uita-te pe documentatie.
Semnatura functiei mysqli_fetch_array este asta: mixed mysqli_fetch_array ( mysqli_result $result [, int $resulttype = MYSQLI_BOTH ] ) Unde dai tu ca parametru un mysqli_result? Eu vad ca ii dai un string. Deloc intamplator insa, mysqli::query returneaza Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE. Mie asta instant imi spune ca mysqli_fetch_array trebuie apelat dupa mysqli::query, nu? Mai pe romaneste spus: Executi un query SQL cu $db->query("string") si obti o resursa. Folosesti apoi resursa aceea pentru a obtine rezultatele, folosind mysqli_fetch_array. $res = $db->query("select * from shop_subcategories"); $rand = mysqli_fetch_array($res); Noi nu ne pierdem, doar ca discutam mai high-level in speranta ca te fortam sa citesti documentatia si intelegi singur lucrurile astea, nu-ti dam noi mura-n gura. |
#15
Posted 03 July 2013 - 11:48
M-am uitat si reuitat pe documentatie.
Am inteles despre ce @sergiu_spooky vorbeste. Aplicam mysql_fetch_array unui string (sir) si nu unui rezultat de tip int (intreg). Prin urmare, ca sa fiu sigur, teoretic, m-am gandit la: $res1=$db->query("select [b]id[/b] from shop_categories where category='$category'"); $rand1 = mysqli_fetch_array($res1);Pentru ca sunt putin sceptic, am adaugat si: $rand1[id]=(int)$rand1[id]; Codul final: $res1=$db->query("select id from shop_categories where category='$category'"); $rand1 = mysqli_fetch_array($res1); $rand1[id]=(int)$rand1[id]; $res2=$db->query("select * from shop_subcategories"); $rand2=mysqli_fetch_array($res2); $rand2[id]=(int)$rand2[id]; // merg pe "intuneric" $db->query("Insert into shop_subcategories (main_category_id) values ({$rand1[id]})");Codul se executa, nu mai primesc nici o eroare, main_category_id este populat cu inca un rand continand $rand1[id] care este tot... zero. |
|
#16
Posted 03 July 2013 - 14:47
La tine problema este de logica. Vrei ultimul rand inserat. Presupunand ca id-ul este cu auto-increment, ai nevoie de valoarea cea mai mare, adica ORDER BY id DESC.
Apoi, ai nevoie de un singur rezultat, deci ai nevoie de un LIMIT 1, ca sa nu utilizezi baza de date deamboulea. Si pentru ca ai nevoie doar de id pentru primul query, poti face lejer select doar pe field-ul id. In cazul asta query-ul tau devine SELECT `id` from `shop_categories` WHERE category='$category' ORDER BY id DESC LIMIT 1;Apoi, este obligatoriu sa verifici daca $rand1 este valid (daca query-ul a fost executat corect). Dupa asta, in $rand1 ai un array cu o cheie si o valoare. Accesezi gresit cheia array-ului, pentru ca tu nu ai nici o constanta numita id. $rand1[id]=(int)$rand1[id];Este inutil avand in vedere ca datele extrase deja sunt in baza de date. Era util doar la introducerea in primul tabel. $rand1[id] trebuie sa fie $rand1['id'] fara nici o discutie. Nu exista exceptii decat atunci cand ai definita o constanta id. Si ca sa te supar putin, toata chestia asta se putea face direct din mysql cu insert into select, deci o singura linie de cod. |
#17
Posted 03 July 2013 - 18:14
Daca folosesti o constanta nedeclarata e evaluata automat ca string, deci $rand[id] e echivalent cu $rand['id']. Nu inseamna ca e OK sa scrii asa.
|
#18
Posted 03 July 2013 - 22:45
depinde de configuratia php. De cele mai multe ori iti da erori si nu stii de unde sa le iei tocmai de la chestii de genul.
Zilele trecute citeam ceva de genul asta pe stackoverflow |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users