Salut! Nu prea frecventez aceasta arie, in general descurcandu-ma usor cu informatiile pe care le gasesc pe internet, dar am am ajuns intr-un impas din care nu pot iesi… din pacate.

Folosindu-ma de tutorialul de la am reusit sa imi creez propriul tabel, sa introduc date si sa execut cateva comenzi simple (gen: select * from tabel). Problema apare cand am incercat sa rulez comenzi mai „complicate” de exemplu SELECT Numele_jucatorului, Varsta FROM jucatori WHERE Echipa_Id = (SELECT Id FROM echipe WHERE upper(trim(Numele_Echipei)) = upper(trim(echipa))). In pointerul result nu este pus nici un rand, nimic. Am verificat daca respectiva comanda s-a lansat cu succes (ma refer la mysql_query), am verificat daca num_fields primeste vreo valoare si paradoxal, primeste pe cea buna (in cazul nostru 2) dar in bucla while (bolduita in codul de mai jos) nu intra. Cu alte cuvinte in result nu se afla nimic.

Cum ar trebui sa procedez mai departe? Stiu ca respectiva comanda este buna din punct de vedere sintactic si pe deasupra returneaza valorile corecte. Dar de ce nu merge? Comenzi gen select * from table merg, dar aceasta comanda si nu numai, nu… Atasez mai departe bucatile din cod care le-am considerat eu importante ….

ia-o si tu prin eliminare.

1. asigura-te ca de fapt, tie comanda aia chiar iti intoarce chestii pe bune. Vezi cu cum arata de fapt comanda trimisa (poate ai vreun caracter care trebuie escaped si nu este in comanda).

vezi ce-ti intoarce functia aia mai exact, incearca sa afli de ce result ramane null. vezi si daca ce trimiti ca parametru nu e din greseala null.

while ((row = mysql_fetch_row(result))!=NULL)

mysql_fetch_row(result) nu merge pt ca „result” e null si tu de fapt ii ceri sa faca mysql_fetch_row(null).

mysql_store_result() also returns a null pointer if reading of the result set failed. You can check whether an error occurred by checking whether mysql_error() returns a nonempty string, mysql_errno() returns nonzero, or mysql_field_count() returns zero.

Picard catre La-Forja: hold the line!!! La care La-Forja: tine-o tu ca am dat abort, teleporta-m-as pe voi, betivi ce sunteti… mai ales Deita.

Nambar oan deschise geamurile la Entarpraiz; Picard vazand asta ii spuse lu Raica sa incarce torpilele.

Multumesc pentru interes. Am sa iti spun cum am procedat in final.

asigura-te ca de fapt, tie comanda aia chiar iti intoarce chestii pe bune. Vezi cu profiler cum arata de fapt comanda trimisa (poate ai vreun caracter care trebuie escaped si nu este in comanda).

Am verificat de atunci si merge.

Ideea e urmatoarea. Am facut acelasi lucru propus de tine, la momentul respectiv, si anume sa parcurg pas cu pas. Chiar si tu ai zis ca:

mysql_store_result() also returns a null pointer if reading of the result set failed.

Cu alte cuvinte, daca respectiva comanda nu ar fi mers mi-ar fi intrat pe if (result == NULL) si mi-ar fi returnat „Nu am gasit nici o inregistrare”. Macar as fi inteles ca ceva e in neregula cu result. Dar nu! Deci am continuat. Am intrat in bucla while si am tot inserat comanda „printf(„mesaj”)” la inceput in ‘if’ apoi in ‘for’ finalizand cu plasarea comenzi chiar sub ‘while’. De unde si presupunerea eronata de la inceput cum ca in result nu s-ar afla nimic. Dar problema nu a fost cu result, ci cu functia fetch_row, din cate aveam sa realizez ulterior.

Se pare ca functia ‘fetch’ in acest caz nu functioneaza. Sa fie de la faptul ca in interiorul comenzii am folosit doua selecturi, sa fi fost din cu totul alt motiv necunoscut de mine, n-am de unde sa stiu.

Dar am rezolvat-o intr-un final. Am „spart” comanda initiala in doua, am rulat separat ” (SELECT Id FROM echipe WHERE upper(trim(Numele_Echipei)) = upper(trim(‘%s’))) „, a mers, am memorat rezultatul primit si l-am folosit in cele din urma in cealalta bucata: ” SELECT Numele_jucatorului, Varsta FROM jucatori WHERE Echipa_Id = X „.

Din nou, multumesc ptr ajutor.

da, bizar. poate e ceva cu functia fetch_row si nested selects, se bulverseaza ca vede doua selecturi deci doua recordseturi, vezi poate poti sa dai submit ca bug undeva, macar te edifica baietii daca e bug sau nu. poate trebuia sa folosesti fetch_array in schimb, etc.

Picard catre La-Forja: hold the line!!! La care La-Forja: tine-o tu ca am dat abort, teleporta-m-as pe voi, betivi ce sunteti… mai ales Deita.

Nambar oan deschise geamurile la Entarpraiz; Picard vazand asta ii spuse lu Raica sa incarce torpilele.

Manualul MySQL spune ca A row subquery is a subquery variant that returns a single row. Pentru cazurile cand subquery-ul intoarce mai multe rows, operatorii sunt ANY, IN si SOME. So, modifica subquery-ul in felul urmator:

sau foloseste un operator din cei 3.

Btw, e good practice (security stuff) sa pui LIMIT 1 atunci cand astepti un singur row, chiar si atunci cand [crezi tu ca] e improbabil ca query-ul sa intoarca mai multe. In plus, query-ul e si optimizat, pentru ca MySQL se opreste la primul row gasit. E valabil pentru orice situatie in care astepti maxim N rows.

ce beton e mysql, n-o stiam pe asta cu Limit. De-ar avea si sql server asa ceva, la fel de simplist.

Picard catre La-Forja: hold the line!!! La care La-Forja: tine-o tu ca am dat abort, teleporta-m-as pe voi, betivi ce sunteti… mai ales Deita.

Nambar oan deschise geamurile la Entarpraiz; Picard vazand asta ii spuse lu Raica sa incarce torpilele.

Da ma, sunt suta la suta sigur. Respectivul query returneaza un singur rand. Ce naiba, eu am facut intreaga baza de date (inclusiv tabelele)…

Stiu si despre Limit, dar in acest caz nu era nevoie. Eu raman la ideea ca fetch_row nu merge cand folosesti subqueries…

Citeste articolul pe: XtremPC

O problema legata de Mysql si C

Salut! Nu prea frecventez aceasta arie, in general descurcandu-ma usor cu informatiile pe care le gasesc pe internet, dar am am ajuns intr-un impas din care nu pot iesi… din pacate.

Folosindu-ma de tutorialul de la am reusit sa imi creez propriul tabel, sa introduc date si sa execut cateva comenzi simple (gen: select * from tabel). Problema apare cand am incercat sa rulez comenzi mai „complicate” de exemplu SELECT Numele_jucatorului, Varsta FROM jucatori WHERE Echipa_Id = (SELECT Id FROM echipe WHERE upper(trim(Numele_Echipei)) = upper(trim(echipa))). In pointerul result nu este pus nici un rand, nimic. Am verificat daca respectiva comanda s-a lansat cu succes (ma refer la mysql_query), am verificat daca num_fields primeste vreo valoare si paradoxal, primeste pe cea buna (in cazul nostru 2) dar in bucla while (bolduita in codul de mai jos) nu intra. Cu alte cuvinte in result nu se afla nimic.

Cum ar trebui sa procedez mai departe? Stiu ca respectiva comanda este buna din punct de vedere sintactic si pe deasupra returneaza valorile corecte. Dar de ce nu merge? Comenzi gen select * from table merg, dar aceasta comanda si nu numai, nu… Atasez mai departe bucatile din cod care le-am considerat eu importante ….

ia-o si tu prin eliminare.

1. asigura-te ca de fapt, tie comanda aia chiar iti intoarce chestii pe bune. Vezi cu cum arata de fapt comanda trimisa (poate ai vreun caracter care trebuie escaped si nu este in comanda).

vezi ce-ti intoarce functia aia mai exact, incearca sa afli de ce result ramane null. vezi si daca ce trimiti ca parametru nu e din greseala null.

while ((row = mysql_fetch_row(result))!=NULL)

mysql_fetch_row(result) nu merge pt ca „result” e null si tu de fapt ii ceri sa faca mysql_fetch_row(null).

mysql_store_result() also returns a null pointer if reading of the result set failed. You can check whether an error occurred by checking whether mysql_error() returns a nonempty string, mysql_errno() returns nonzero, or mysql_field_count() returns zero.

Picard catre La-Forja: hold the line!!! La care La-Forja: tine-o tu ca am dat abort, teleporta-m-as pe voi, betivi ce sunteti… mai ales Deita.

Nambar oan deschise geamurile la Entarpraiz; Picard vazand asta ii spuse lu Raica sa incarce torpilele.

Multumesc pentru interes. Am sa iti spun cum am procedat in final.

asigura-te ca de fapt, tie comanda aia chiar iti intoarce chestii pe bune. Vezi cu profiler cum arata de fapt comanda trimisa (poate ai vreun caracter care trebuie escaped si nu este in comanda).

Am verificat de atunci si merge.

Ideea e urmatoarea. Am facut acelasi lucru propus de tine, la momentul respectiv, si anume sa parcurg pas cu pas. Chiar si tu ai zis ca:

mysql_store_result() also returns a null pointer if reading of the result set failed.

Cu alte cuvinte, daca respectiva comanda nu ar fi mers mi-ar fi intrat pe if (result == NULL) si mi-ar fi returnat „Nu am gasit nici o inregistrare”. Macar as fi inteles ca ceva e in neregula cu result. Dar nu! Deci am continuat. Am intrat in bucla while si am tot inserat comanda „printf(„mesaj”)” la inceput in ‘if’ apoi in ‘for’ finalizand cu plasarea comenzi chiar sub ‘while’. De unde si presupunerea eronata de la inceput cum ca in result nu s-ar afla nimic. Dar problema nu a fost cu result, ci cu functia fetch_row, din cate aveam sa realizez ulterior.

Se pare ca functia ‘fetch’ in acest caz nu functioneaza. Sa fie de la faptul ca in interiorul comenzii am folosit doua selecturi, sa fi fost din cu totul alt motiv necunoscut de mine, n-am de unde sa stiu.

Dar am rezolvat-o intr-un final. Am „spart” comanda initiala in doua, am rulat separat ” (SELECT Id FROM echipe WHERE upper(trim(Numele_Echipei)) = upper(trim(‘%s’))) „, a mers, am memorat rezultatul primit si l-am folosit in cele din urma in cealalta bucata: ” SELECT Numele_jucatorului, Varsta FROM jucatori WHERE Echipa_Id = X „.

Din nou, multumesc ptr ajutor.

da, bizar. poate e ceva cu functia fetch_row si nested selects, se bulverseaza ca vede doua selecturi deci doua recordseturi, vezi poate poti sa dai submit ca bug undeva, macar te edifica baietii daca e bug sau nu. poate trebuia sa folosesti fetch_array in schimb, etc.

Picard catre La-Forja: hold the line!!! La care La-Forja: tine-o tu ca am dat abort, teleporta-m-as pe voi, betivi ce sunteti… mai ales Deita.

Nambar oan deschise geamurile la Entarpraiz; Picard vazand asta ii spuse lu Raica sa incarce torpilele.

Manualul MySQL spune ca A row subquery is a subquery variant that returns a single row. Pentru cazurile cand subquery-ul intoarce mai multe rows, operatorii sunt ANY, IN si SOME. So, modifica subquery-ul in felul urmator:

sau foloseste un operator din cei 3.

Btw, e good practice (security stuff) sa pui LIMIT 1 atunci cand astepti un singur row, chiar si atunci cand [crezi tu ca] e improbabil ca query-ul sa intoarca mai multe. In plus, query-ul e si optimizat, pentru ca MySQL se opreste la primul row gasit. E valabil pentru orice situatie in care astepti maxim N rows.

ce beton e mysql, n-o stiam pe asta cu Limit. De-ar avea si sql server asa ceva, la fel de simplist.

Picard catre La-Forja: hold the line!!! La care La-Forja: tine-o tu ca am dat abort, teleporta-m-as pe voi, betivi ce sunteti… mai ales Deita.

Nambar oan deschise geamurile la Entarpraiz; Picard vazand asta ii spuse lu Raica sa incarce torpilele.

Da ma, sunt suta la suta sigur. Respectivul query returneaza un singur rand. Ce naiba, eu am facut intreaga baza de date (inclusiv tabelele)…

Stiu si despre Limit, dar in acest caz nu era nevoie. Eu raman la ideea ca fetch_row nu merge cand folosesti subqueries…

Citeste articolul pe: XtremPC

Postat de pe data de 31 ian., 2010 in categoria Noutăți. Poti urmari comentariile acestui articol prin RSS 2.0. Acest articol a fost vizualizat de 457 ori.

Publica un raspuns