Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> problem z funkcją get_all_rows, get all rows
jason300
post
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 26.11.2012

Ostrzeżenie: (0%)
-----


Witam mam problem z funkcją .
  1. function get_all_rows ($q) {
  2. global $conn;
  3. $rows=array();
  4. $result = odbc_exec ($conn, $q);
  5. if ($result) {
  6. while ($row = odbc_fetch_array($result))
  7. $rows[]=$row;
  8. odbc_free_result($result);
  9. return $rows;
  10. }
  11. return " " ;
  12. }



Podczas wywołania wyskakuje błąd
specyfikacja to php 5.3.8 mysql 5.5.28 platforma CENTOS 6 mysql odbc connector chyba 5.2.2 z tego co pamiętam.

Warning: odbc_exec() [function.odbc-exec]: SQL error: [unixODBC][MySQL][ODBC 5.2(w) Driver][mysqld-5.5.28]Result consisted of more than one row, SQL state S1000 in SQLExecDirect in /home/struktura/index.php on line 569 gdzie linia 569 to dokładnie $result = odbc_exec ($conn, $q);

Moje pytanie byłoby takie jak miałbym zabezpieczyć się przed tym wywołaniem i co mam zrobić żeby wyświetlało mi wszystkie "rows" a nie pokazywało taki błąd
Od strony użytkownika wygląda to tak że jeśli jakaś osoba ma przypisane kilka wartości ( spółek w tym przypadku to wyświetla się ten błąd a jeśli jest to tylko jedna wartość to wyświetla się poprawnie)

a tutaj przykład wywołania

$q ="select *, unit.id as unit__id, employee.id as employee__id,
position.floor as depfloor, position.filename as depfilename, position.name as depname
from employee
inner join employeeunit on employee.id = employeeunit.employee_id
inner join unit on employeeunit.unit_id = unit.id
left join position on unit.departament = position.id
where concat(lower(trim(employee.lastname)),' ',lower(trim(employee.firstname))) like '".$n."%'
or concat(lower(trim(employee.firstname)),' ',lower(trim(employee.lastname))) like '".$n."%'
or employee.mobile like '%".$n."%'
or employee.telephone like '%".$n."%'";

$q.="group by employee.id order by lastname, firstname limit 100";
$rows=get_all_rows($q);

Ten post edytował jason300 26.11.2012, 12:16:03
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jesteś na 100% pewien że chodzi o to właśnie zapytanie?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jason300
post
Post #3





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 26.11.2012

Ostrzeżenie: (0%)
-----


niekoniecznie chodzi o to to jest tylko przykładowe bo tych wywołań jest dużo (około 15 ) Problem polega na tym co mam zrobić żeby ten błąd nie występował czy dodać coś do zapytania z bazy danych czy też coś zrobić z funkcją jeśli tak to co . Aha i błąd wywala do linii w której jest funkcja a nie konkretne wywołanie

Dziękuję za odpowiedź

Ten post edytował jason300 26.11.2012, 15:17:14
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




....
To znajdź to zapytanie, które ten błąd generuje a my ci powiemy jak je poprawić...

Cytat
czy też coś zrobić z funkcją
To nie funkcja jest problemem a zapytanie. I to zapytanie należy poprawić.

  1. function get_all_rows ($q) {
  2.  
  3. global $conn;
  4.  
  5. $rows=array();
  6.  
  7. $result = odbc_exec ($conn, $q);
  8.  
  9. if ($result) {
  10.  
  11. while ($row = odbc_fetch_array($result))
  12.  
  13. $rows[]=$row;
  14.  
  15. odbc_free_result($result);
  16.  
  17. return $rows;
  18.  
  19. } else die('BLEDNE ZAPYTANIE TO:'.$q);
  20.  
  21. return " ";

I już bedziesz wiedział które to zapytanie. Na przyszłość sam tak rób.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jason300
post
Post #5





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 26.11.2012

Ostrzeżenie: (0%)
-----


no ok dodałbym jeszcze że problem zaczął się pojawiać po migracji z Windows Server 2003 na linuksa Centos 6
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Ty podaj lepiej to zapytanie. Napisałem ci już jak je znaleźć...


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jason300
post
Post #7





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 26.11.2012

Ostrzeżenie: (0%)
-----


super dzięki już mam

select *, estructuredb.getunitroot_company_id(unit.id) as spolka from employeeunit left join unit on employeeunit.unit_id = unit.id where employeeunit.employee_id=817 order by spolka

i nr 2 w innym miejscu

select *, employee.photourlsuffix as ephoto,unit.name as unit__name, unit.id as unit__id, estructuredb.getunitroot_company_id(unit.id) as spolka, employee.id as employee__id, position.floor as depfloor, position.filename as depfilename, position.name as depname from employee inner join employeeunit on employee.id = employeeunit.employee_id inner join unit on employeeunit.unit_id = unit.id left join position on unit.departament = position.id where length(employee.photourlsuffix)>1 limit 4,4








Ten post edytował jason300 26.11.2012, 15:37:07
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Podejrzewam, że chodzi o funkcję getunitroot_company_id() która zwraca więcej niż jeden rekord. Pokaż teraz jak wygląda ta funkcja
Powód edycji: [nospor]:


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jason300
post
Post #9





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 26.11.2012

Ostrzeżenie: (0%)
-----


tak wygląda cała funkcja z zapytaniem nr 1 .
  1. function gs ($id) {
  2. if ($id) {
  3. $q = "select *, estructuredb.getunitroot_company_id(unit.id) as spolka
  4. from employeeunit
  5. left join unit on employeeunit.unit_id = unit.id
  6. where employeeunit.employee_id=$id
  7. order by spolka";
  8. $rows = get_all_rows($q);
  9. return $rows;
  10. } else {return false;}
  11. }


a tak fragment kodu z całym zapytaniem nr 2

  1. $input = $_GET['input'];
  2. $len = strlen($input);
  3. $limit = isset($_GET['limit']) ? (int) $_GET['limit'] : 0;
  4. $res_t = array();
  5. $count = 0;
  6.  
  7. include ('inc.func.php');$conn = dbconnect();
  8. if ($len or 1) {
  9. #$input = mysql_escape_string(trim(strip_tags(($input))));
  10. #$input = iso2cp(mb_strtolower(mb_convert_encoding ($input, "iso-8859-2", "utf-8"), "iso-8859-2"));
  11. $input=iconv("windows-1250","utf-8",$input);
  12. //echo $input; die();
  13. $q0 = "select count(*) as cnt
  14. from employee
  15. inner join employeeunit on employee.id = employeeunit.employee_id
  16. inner join unit on employeeunit.unit_id = unit.id
  17. left join position on unit.departament = position.id
  18. where length(employee.photourlsuffix)>4 limit 1";
  19.  
  20. $res = get_all_rows($q0);
  21. $count = $res[0]['cnt']; //echo "z";die ();
  22. //error_log ($count);
  23. do {
  24. $randlimit = mt_rand(1,$count); //echo ($randlimit);
  25. //error_log($randlimit);
  26. $q = "select *, employee.photourlsuffix as ephoto,unit.name as unit__name, unit.id as unit__id,
  27. estructuredb.getunitroot_company_id(unit.id) as spolka, employee.id as employee__id,
  28. position.floor as depfloor, position.filename as depfilename, position.name as depname
  29. from employee
  30. inner join employeeunit on employee.id = employeeunit.employee_id
  31. inner join unit on employeeunit.unit_id = unit.id
  32. left join position on unit.departament = position.id
  33. where length(employee.photourlsuffix)>4 limit ".$randlimit.",1";
  34.  
  35. // jak wylosuje z niefunkcjonalnej losowac jeszcz eraz
  36. // estructuredb.getunitroot_company_id(unit.id) as spolka
  37.  
  38. //$q.="group by employee.id order by lastname, firstname limit 100";
  39. $res=get_all_rows($q);// print_R($res);
  40. } while ($res[0]['spolka'] <> 2184);
  41. odbc_close($conn);


Ten post edytował jason300 26.11.2012, 15:42:57
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




o rety....

Napiszę jeszcze raz:
Podaj jak wygląda KOD SQL FUNKCJI getunitroot_company_id

Nie kod php, jak ty wywołujesz zapytanie, ale kod SQL funkcji getunitroot_company_id()


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jason300
post
Post #11





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 26.11.2012

Ostrzeżenie: (0%)
-----


Dobra tylko takie pytanie jak to znaleźć questionmark.gif Wyszukując total commanderem w folderze skryptu znajduję jedynie jej wywołania. Wiem , że to może głupie pytanie , ale dopiero się uczę więc proszę z góry o wybaczenie.
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Funkcje SLQ znajdują się w bazie danych a nie na dysku. Zapewne przy pomocy PHPMyAdmin (lub innym programie tego typu), które to operuje na danych bazy, uda ci się znaleźć kod tej funkcji


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jason300
post
Post #13





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 26.11.2012

Ostrzeżenie: (0%)
-----


no i super o to chodziło wyszukiwanie w zrzucie bazy pomogło

  1. CREATE DEFINER=`root`@`localhost` FUNCTION `getunitroot_company_id`(id1 int(11)) RETURNS int(11)
  2. BEGIN
  3.  
  4. SET @parent_id = id1, @fuse = 1, @return_id = 0;
  5.  
  6. petla: while 1 do
  7. SET @return_id = @parent_id;
  8. SELECT parent_id INTO @parent_id FROM unit WHERE id=@parent_id;
  9. IF @parent_id = 22 THEN LEAVE petla; END IF;
  10.  
  11. SET @fuse = @fuse + 1;
  12. IF @fuse > 100 THEN LEAVE petla; END IF;
  13. END WHILE petla;
  14.  
  15. RETURN @return_id;
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Tak jak myślałem. Problemem jest o to zapytanie:
SELECT parent_id INTO @parent_id FROM unit WHERE id=@parent_id;
To zapytanie zwraca więcej niż jeden rekord i dlatego pojawia się ten błąd.

Gdyby je zamienić na coś takiego
SELECT parent_id INTO @parent_id FROM unit WHERE id=@parent_id limit 1;
to zapewne błąd by zniknął.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jason300
post
Post #15





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 26.11.2012

Ostrzeżenie: (0%)
-----


super dziękuję bardzo , jutro sprawdzę mam tylko takie pytanie jak to jest że to działa na windowsie server 2003 a to samo na centosie wywala błąd questionmark.gif To totalnie bez sensu zważywszy na to że jest to na tej samej wersji php i czy jest jakaś możliwość żebym mógł jakoś tą funkcję zmodyfikować tak aby poprawnie wyświetlało wynik nawet jeśli byłoby to więcej niż jeden "row"
Go to the top of the page
+Quote Post
nospor
post
Post #16





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
To totalnie bez sensu zważywszy na to że jest to na tej samej wersji php
Zrozum w końcu - to nie ma żadnego związku z php. To jest błąd MYSQL

Cytat
i czy jest jakaś możliwość żebym mógł jakoś tą funkcję zmodyfikować tak aby poprawnie wyświetlało wynik nawet jeśli byłoby to więcej niż jeden "row"
No to ci przecież napisałem co masz poprawić.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jason300
post
Post #17





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 26.11.2012

Ostrzeżenie: (0%)
-----


super to działa przepraszam za głupie pytania już wszystko rozumiem
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 23:34