Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z funkcją get_all_rows
Forum PHP.pl > Forum > PHP
jason300
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);
nospor
Jesteś na 100% pewien że chodzi o to właśnie zapytanie?
jason300
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ź
nospor
....
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.
jason300
no ok dodałbym jeszcze że problem zaczął się pojawiać po migracji z Windows Server 2003 na linuksa Centos 6
nospor
Ty podaj lepiej to zapytanie. Napisałem ci już jak je znaleźć...
jason300
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






nospor
Podejrzewam, że chodzi o funkcję getunitroot_company_id() która zwraca więcej niż jeden rekord. Pokaż teraz jak wygląda ta funkcja
jason300
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);
nospor
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()
jason300
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.
nospor
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
jason300
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;
nospor
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ął.
jason300
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"
nospor
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ć.
jason300
super to działa przepraszam za głupie pytania już wszystko rozumiem
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.