Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Klasa PDO, nie zapisuje jednej kolumny
Forum PHP.pl > Forum > Przedszkole
-seba-
Tak na wstępie, nie wiem czy dobry dział, ale innego wybrać nie mogłem, bo hasła do konta zapomniałem, a mail resetujący hasło już jakiś czas nie przychodzi.


Mam problem z funkcją w klasie wspomagającej PDO, a dokładniej niby działa, ale wykonując takie zapytanie
  1. $sql = $db->mexecute('INSERT INTO dupy (id,pid,sid) VALUES (:id,:pid,:sid)',
  2. array(':id' => null, ':pid' => null, ':sid' => null), array(array(92, 666, 6), array(93, 666, 4)));

na 3 wysłane parametry zapisują się tylko 2 pierwsze, a w miejsce 3 zapisuje się 0 (zero). Każda kolumna w bazie jest intem, a funkcja "mexecute" wygląda tak
  1. public function mexecute($query, $binds = null, $val = null) {
  2. try {
  3. if($binds !== null && $val !== null) {
  4. if(is_array($val)) {
  5. $sql = $this->dba->prepare($query);
  6. if(is_array($binds)) {
  7. if(is_array(current($binds))) {
  8. foreach($binds as $n => &$bind)
  9. $sql->bindParam(is_int($n) ? $n+1 : $n, $bind[0], $bind[1]);
  10.  
  11. foreach($val as &$val2) {
  12. $i=0;
  13. foreach($binds as &$bind) {
  14. $bind[0] = $val2[$i++];
  15. }
  16. $sql->execute();
  17. }
  18.  
  19. return $sql;
  20. }
  21. else {
  22. foreach($binds as $n => &$bind) {
  23. $sql->bindParam(is_int($n) ? $n+1 : $n, $bind);
  24. echo $n.' '.$bind.'<br />'; // oczysiście każde użycie echo czy var_dump jest tylko dla sprawdzenia, czy wartości się przypisują poprawnie
  25. }
  26. var_dump($binds);
  27. echo '<br />';
  28.  
  29. foreach($val as &$val2) {
  30. $i=0;
  31. foreach($binds as &$bind) {
  32. $bind = $val2[$i++];
  33. echo $i.': '.$bind.'|'.$val2[$i-1].' # ';
  34. }
  35. echo '<br />';
  36. var_dump($binds);
  37. echo '<br />';
  38. $sql->execute();
  39. $sql->debugDumpParams();
  40. echo '<br />';
  41. }
  42.  
  43. return $sql;
  44. }
  45. }
  46. else {
  47. $sql->bindParam(1, $binds);
  48.  
  49. foreach($val as $binds)
  50. $sql->execute();
  51.  
  52. return $sql;
  53. }
  54. }
  55. else {
  56. echo '[mexecute] Parametr #3 nie jest tablicą, użyj \'execute\' do wykonania pojedynczego zapytania!';
  57. }
  58. }
  59. else {
  60. echo '[mexecute] Parametr #2 lub #3 jest pusty!';
  61. }
  62. }
  63. catch(PDOException $e) {
  64. echo '[mexecute] Błąd zapytania: '.$e->getMessage();
  65. }
  66. return null;
  67. }

a na stronie wyświetla mi się coś takiego
  1. :id 1
  2. :pid 1
  3. :sid 1
  4. array(3) { [":id"]=> &string(1) "1" [":pid"]=> &string(1) "1" [":sid"]=> &string(1) "1" }
  5. 1: 92|92 # 2: 666|666 # 3: 6|6 #
  6. array(3) { [":id"]=> &int(92) [":pid"]=> &int(666) [":sid"]=> &int(6) }
  7. SQL: [52] INSERT INTO dupy (id,pid,sid) VALUES (:id,:pid,:sid) Params: 3 Key: Name: [3] :id paramno=0 name=[3] ":id" is_param=1 param_type=2 Key: Name: [4] :pid paramno=1 name=[4] ":pid" is_param=1 param_type=2 Key: Name: [4] :sid paramno=2 name=[4] ":sid" is_param=1 param_type=2
  8. 1: 93|93 # 2: 666|666 # 3: 4|4 #
  9. array(3) { [":id"]=> &int(93) [":pid"]=> &int(666) [":sid"]=> &int(4) }
  10. SQL: [52] INSERT INTO dupy (id,pid,sid) VALUES (:id,:pid,:sid) Params: 3 Key: Name: [3] :id paramno=0 name=[3] ":id" is_param=1 param_type=2 Key: Name: [4] :pid paramno=1 name=[4] ":pid" is_param=1 param_type=2 Key: Name: [4] :sid paramno=2 name=[4] ":sid" is_param=1 param_type=2

czyli tutaj jest chyba wszystko ok. Dodam jeszcze tylko tyle, że gdy wykorzystam tę funkcję
  1. public function execute($query, $binds = null, $type = 0) {
  2. try {
  3. if($binds !== null) {
  4. $sql = $this->dba->prepare($query);
  5. if(is_array($binds)) {
  6. if(is_array(current($binds))) {
  7. foreach($binds as $n => $bind)
  8. $sql->bindValue(is_int($n) ? $n+1 : $n, $bind[0], $bind[1]);
  9. }
  10. else {
  11. if($type) {
  12. $sql->execute($binds);
  13.  
  14. return $sql;
  15. }
  16. else {
  17. foreach($binds as $n => $bind)
  18. $sql->bindValue(is_int($n) ? $n+1 : $n, $bind);
  19. }
  20. }
  21. }
  22. else {
  23. $sql->bindValue(1, $binds);
  24. }
  25.  
  26. $sql->execute();
  27.  
  28. return $sql;
  29. }
  30. else {
  31. echo '[execute] Parametr #2 jest pusty!';
  32. }
  33. }
  34. catch(PDOException $e) {
  35. echo '[execute] Błąd zapytania: '.$e->getMessage();
  36. }
  37. return null;
  38. }

z takim wywołaniem
  1. $sql = $db->execute('INSERT INTO dupy (id,pid,sid) VALUES (:id,:pid,:sid)',
  2. array(':id' => 9, ':pid' => 666, ':sid' => 5454));

to oczywiście w bazie zapisują się wszystkie 3 wartości w 3 kolumnach. Ktoś może wie czemu te podwójne zapisanie wartości nie działa tak jak trzeba? Coś robię źle?
-seba-
Dodam jeszcze, że wywołując taką funkcję
  1. public function execute($query, $binds = null, $type = 0) {
  2. try {
  3. if($binds !== null) {
  4. $sql = $this->dba->prepare($query);
  5. if(is_array($binds)) {
  6. if(is_array(current($binds))) {
  7. foreach($binds as $n => &$bind)
  8. $sql->bindValue(is_int($n) ? $n+1 : $n, ($bind[0] !== null) ? $bind[0] : $bind, ($bind[1] !== null) ? $bind[1] : PDO::PARAM_STR);
  9.  
  10. print_r($binds);
  11. }
  12. else {
  13. if($type) {
  14. $sql->execute($binds);
  15.  
  16. return $sql;
  17. }
  18. else {
  19. foreach($binds as $n => $bind)
  20. $sql->bindValue(is_int($n) ? $n+1 : $n, $bind);
  21. }
  22. }
  23. }
  24. else {
  25. $sql->bindValue(1, $binds);
  26. }
  27.  
  28. $sql->execute();
  29.  
  30. return $sql;
  31. }
  32. else {
  33. echo '[execute] Parametr #2 jest pusty!';
  34. }
  35. }
  36. catch(PDOException $e) {
  37. echo '[execute] Błąd zapytania: '.$e->getMessage();
  38. }
  39. return null;
  40. }

w ten sposób
  1. $sql = $db->execute('INSERT INTO dupy (id,pid,sid) VALUES (:id,:pid,:sid)',
  2. array(':id' => array(9, PDO::PARAM_INT), ':pid' => array(666, PDO::PARAM_INT), ':sid' => array(9454, PDO::PARAM_INT)));

to także w 3 kolumnie zapisuje się 0, zamiast podane wartości, ale wystarczy że dam
  1. $sql = $db->execute('INSERT INTO dupy (id,pid,sid) VALUES (:id,:pid,:sid)',
  2. array(':id' => array(9, PDO::PARAM_STR), ':pid' => array(666, PDO::PARAM_STR), ':sid' => array(9454, PDO::PARAM_STR)));

i już zapisują się wszystkie 3 wartości. Żeby była jasność, przypomnę jeszcze raz, że w bazie wszystkie 3 kolumny mają ustawiony typ na int.
-seba-
Mógłby ktoś pomóc? Co tutaj jest źle zrobione, że tak dziwnie to działa?
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.