Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cum sterg mails din Promotions

Vanzare cumparare fara transfer b...

Receptie ciudata, in functie de t...

Donez medicamente renale ptr pisica
 Ce componenta e asta si ce ziceti...

Dupa 20 ani de facultate, am uita...

Mobile.de ofera imprumut de bani ...

problema test grila
 Digi24 a disparut de pe TV Lg

Drept de proprietate intelectuala...

Jante noi shitbox

Trinitas TV 4K
 Dacia 1316 cu 6 usi ...

Frecventa modificata radio

Un nou pericol pt batrani

Ar trebui sa vindem imobiliarele ...
 

Mysqli_fetch_array - nu pot extrage id-urile randurilor

- - - - -
  • Please log in to reply
26 replies to this topic

#1
neotester

neotester

    Junior Member

  • Grup: Members
  • Posts: 34
  • Înscris: 03.12.2010
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.

#2
sorin147

sorin147

    Senior Member

  • Grup: Senior Members
  • Posts: 6,368
  • Înscris: 11.08.2003
escape characters ajuta?
\'   \"

#3
neotester

neotester

    Junior Member

  • Grup: Members
  • Posts: 34
  • Înscris: 03.12.2010

View Postsorin147, on 03 iulie 2013 - 08:05, said:

escape characters ajuta?
\'   \"
Am incercat:
$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_STRING
cee 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
DarkAngelBv

DarkAngelBv

    === Proud owner of === ++++ Audi & Opel ++++

  • Grup: Senior Members
  • Posts: 12,747
  • Înscris: 24.03.2006
$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
sergiu_spooky

sergiu_spooky

    Senior Member

  • Grup: Senior Members
  • Posts: 3,738
  • Înscris: 23.06.2006
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
neotester

neotester

    Junior Member

  • Grup: Members
  • Posts: 34
  • Înscris: 03.12.2010

View PostDarkAngelBv, 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 Posted Image
Daca stii ce sa cauti si folosesti zilnic aceleasi tipuri de structuri vor deveni automatism.
Intr-adevar problema mea e similara cu cea din link-ul tau, in schimb, ma vad inca in postura in care nu am rezolvat problema. Citit acel forum, am testat:
$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
DarkAngelBv

DarkAngelBv

    === Proud owner of === ++++ Audi & Opel ++++

  • Grup: Senior Members
  • Posts: 12,747
  • Înscris: 24.03.2006
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
neotester

neotester

    Junior Member

  • Grup: Members
  • Posts: 34
  • Înscris: 03.12.2010
@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
sergiu_spooky

sergiu_spooky

    Senior Member

  • Grup: Senior Members
  • Posts: 3,738
  • Înscris: 23.06.2006
Altfel spus, unde folosesti variabila $interogare? Posted Image

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
neotester

neotester

    Junior Member

  • Grup: Members
  • Posts: 34
  • Înscris: 03.12.2010

View PostDarkAngelBv, 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)
Ba fac, zic eu. Chiar la inceput (priveste primul post):
$conectare_baza=new mysqli("localhost","user","pass","database");
$interogare="select * from shop_categories";


#11
Raster02

Raster02

    New Member

  • Grup: Members
  • Posts: 22
  • Înscris: 18.10.2012
Pai queryul $interogare="select * from shop_categories";, unde il executi tu ?

Edited by Raster02, 03 July 2013 - 09:17.


#12
DarkAngelBv

DarkAngelBv

    === Proud owner of === ++++ Audi & Opel ++++

  • Grup: Senior Members
  • Posts: 12,747
  • Înscris: 24.03.2006
Tocmai. Tu iti declari interogarea, dar nu o apelezi niciunde.

#13
neotester

neotester

    Junior Member

  • Grup: Members
  • Posts: 34
  • Înscris: 03.12.2010
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:
  • id;
  • category;
  • category_url;
  • parent_id;
  • details.
shop_subcategories cu:
  • id;
  • category;
  • category_url;
  • parent_id;
  • details
  • main_category_id.
Pe mine ma intereseaza sa extrag id-ul ultimei inregistrari din shop_categories care-l voi introduce in main_category_id din shop_subcategories.
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
sergiu_spooky

sergiu_spooky

    Senior Member

  • Grup: Senior Members
  • Posts: 3,738
  • Înscris: 23.06.2006
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
neotester

neotester

    Junior Member

  • Grup: Members
  • Posts: 34
  • Înscris: 03.12.2010
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
DarkAngelBv

DarkAngelBv

    === Proud owner of === ++++ Audi & Opel ++++

  • Grup: Senior Members
  • Posts: 12,747
  • Înscris: 24.03.2006
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
sergiu_spooky

sergiu_spooky

    Senior Member

  • Grup: Senior Members
  • Posts: 3,738
  • Înscris: 23.06.2006
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
DarkAngelBv

DarkAngelBv

    === Proud owner of === ++++ Audi & Opel ++++

  • Grup: Senior Members
  • Posts: 12,747
  • Înscris: 24.03.2006
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

Second Opinion 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate