Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Nowy rekord dodaje się do bazy w dziwny sposób (php + MySQL), nie wiem jak ładniej nazwać ten temat ;)
Maf
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 16.10.2006

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


Krótko i treściwie; ten oto kod:
Kod
<?php
    $isbn = '345-345-123-5423';
    $autor = 'Ktos';
    $tytul = 'Bamboocha';
    $cena = 39.90;
    
    $db = new    mysqli('localhost', 'ksiazki', 'pass', 'ksiazki');

    $stmt = $db->prepare("INSERT INTO ksiazki VALUES (?, ?, ?, ?)");
    $stmt->bind_param('sssd', $isbn, $autor, $tytul, $cena);
    $stmt->execute();
    echo $stmt->affected_rows;
    $stmt->close();
    $db->close();
?>

powinien dodać nowy w pełni wypełniony rekord do tabeli ksiazki w bazie ksiazki. Nowy rekord owszem jest dodany, ale pierwsze 3 pola (tekstowe) sa puste, a czwarte (float) ma wartość 0.00. Czy macie jakiś pomysł?

Ten post edytował Maf 17.10.2006, 09:38:03
Go to the top of the page
+Quote Post
1010
post
Post #2





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


Kod który pokazałeś jest tylko odpowiedzialny za przekazanie danych do klasy... musisz pokazać klasę która to wykonuje...
Pozdro


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





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


Nie wiek jak działa twoja klasa $db, ale na pierwszy rzut oka mogę powiedzieć że w wywołaniu metody prepare() widać, że będzie zapisywanye 4 wartości a w metodzie bind_param() przekazujesz tych wartości 5.
Nie mam pojęcia czy problem jest stąd, ale z tego kodu więcej nie da się wywnioskować.

pozdr.
Go to the top of the page
+Quote Post
batman
post
Post #4





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Do powyższych uwag dodam jeszcze jedną.
W zmiennej $cena masz zapisany string, a w bazie masz pole float. Musisz zrzutować typ na float: (float).


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
Maf
post
Post #5





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 16.10.2006

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


Jedyne z czym moge się zgodzić póki co to typ zmiennej, więc zmieniłem $cena z ciągu na float, ale problem nie znika.
Co do ilości parametrów w bind_param() to są one podane zgodnie z tym, co widnieje na php.net:
http://pl.php.net/manual/pl/function.mysql...-bind-param.php
Co do $db, to jest ona egzemplarzem klasy mysqli, więc powinniście wiedzieć jak działa "moja klasa $db" winksmiley.jpg

Ten post edytował Maf 17.10.2006, 09:38:32
Go to the top of the page
+Quote Post
siemakuba
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


Cytat(Maf @ 17.10.2006, 10:37:16 ) *
Co do ilości parametrów w bind_param() to są one podane zgodnie z tym, co widnieje na php.net: http://pl.php.net/manual/pl/function.mysql...-bind-param.php
Co do $db, to jest ona egzemplarzem klasy mysqli, więc powinniście wiedzieć jak działa "moja klasa $db" ;)

True, mea culpa. Nie korzystałem z mysqli_*, stąd taka wpadka. W takim wypadku moje uwagi stały się nietrafione :)

pozdr.
Go to the top of the page
+Quote Post
Maf
post
Post #7





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 16.10.2006

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


Eh, napisałem całość podobnie, ale proceduralnie, efekt ten sam :/
Kod
<?php
    $isbn = "4354-5456";
    $autor = "Ktostam";
    $tytul = "Bamboocha";
    $cena = 49.95;
    
    $db_link = mysqli_connect('localhost', 'ksiazki', 'pass', 'ksiazki');
    
    printf("Host information: %s\n", mysqli_get_host_info($db_link));
    
    $query = "INSERT INTO ksiazki VALUES (?, ?, ?, ?)";
    $statement = mysqli_prepare($db_link, $query);
    mysqli_stmt_bind_param($statement, "sssd", $isbn, $autor, $tytul, $cena);
    mysqli_stmt_execute($statement);
    printf("%d Row affected\n", mysqli_stmt_affected_rows($statement));
    mysqli_stmt_close($statement);
    mysqli_close($db_link);
?>


Ten post edytował Maf 17.10.2006, 10:04:57
Go to the top of the page
+Quote Post
siemakuba
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


A mógłbyś pokazać te rzeczy:
1. strukturę tabeli ksiazki
2. wynik działania $stmt->bind_param() (powinno zwracać true/false)
3. wynik działania $stmt->execute(); (true/false)

pozdr.
Go to the top of the page
+Quote Post
Maf
post
Post #9





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 16.10.2006

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


1. Struktura tabeli 'ksiazki':
isbn char(13) not null primary key,
autor char(50),
tytul char(100),
cena float(5,2)

2 & 3. Zmienilem kod na:
Kod
<?php
    $isbn = '345-345-123-5423';
    $autor = 'Ktos';
    $tytul = 'Bamboocha';
    $cena = 39.90;
    
    $db = new    mysqli('localhost', 'ksiazki', 'pass', 'ksiazki');

    $stmt = $db->prepare("INSERT INTO ksiazki VALUES (?, ?, ?, ?)");
    echo 'bind_param: '.$stmt->bind_param('sssd', $isbn, $autor, $tytul, $cena)."\n";
    echo 'execute: '.$stmt->execute()."\n";
    echo 'affected_rows: '.$stmt->affected_rows."\n";
    $stmt->close();
    $db->close();
?>


Wyniki:
Kod
bind_param: 1
execute: 1
affected_rows: 1
Go to the top of the page
+Quote Post
siemakuba
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


Przejrzałem jeszcze raz przykład z manuala (http://pl.php.net/manual/pl/function.mysql...-bind-param.php)
i problem leży chyba w kolejności wywołania metody bind_param(), która powinna być wywołana przed nadaniem wartości parametrom: (przykład z manuala)
  1. <?php
  2. $stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
  3. $stmt->bind_param('sssd', $code, $language, $official, $percent);
  4.  
  5. $code = 'DEU';
  6. $language = 'Bavarian';
  7. $official = "F";
  8. $percent = 11.2;
  9. ?>


Sprawdź, powinno być OK IMHO.
pozdr.
Go to the top of the page
+Quote Post
Maf
post
Post #11





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 16.10.2006

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


Już to próbowałem, ale dla Ciebie jeszcze raz to zrobiłem. Wyniki bez zmian, rekord dalej błędny :/
Jeśli ktoś mógłby to odpalić u siebie i podzielić sie efektem to byłbym bardzo wdzięczny. Oto tabela:
Kod
create table ksiazki
( isbn char(13) not null primary key,
  autor char(50),
  tytul char(100),
  cena float(5,2)
);

BTW: mam php-5.1.6-r4 i mysql-4.1.21

Założyłem nawet nowa baze danych z nowiutka tabela i owy wadliwie dodany rekord wygląda tak:
Kod
+------+-------+-------+------+
| isbn | autor | tytul | cena |
+------+-------+-------+------+
|      |       |       | 0.00 |
+------+-------+-------+------+
1 row in set (0.00 sec)

Pozdrawiam.

Ten post edytował Maf 17.10.2006, 11:21:33
Go to the top of the page
+Quote Post
siemakuba
post
Post #12





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


Nie mam w tej chwili dostępu do żadnej instalacji PHP5... Jeżeli nikt mnie nie uprzedzi to wieczorem mogę to w domu przetestować. Zaznaczam jednak, że nie mam żadnego doświadczenia jeżeli chodzi o mysqli_*.

pozdr.
Go to the top of the page
+Quote Post
Maf
post
Post #13





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 16.10.2006

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


Heh no właśnie, bo i tak pytam o to wszystko z czystej ciekawości;) Ten kod np. działa jak trzeba, i jest prostszy jak widać;)
Kod
<?php
    $isbn = '345-345-123-5423';
    $autor = 'Ktos';
    $tytul = 'Bamboocha';
    $cena = 39.90;
    
    $db = new mysqli('localhost', 'ksiazki', 'pass', 'test');
    $db->query("INSERT INTO ksiazki VALUES ('$isbn', '$autor', '$tytul', $cena)");
    $db->close;
?>
Go to the top of the page
+Quote Post
UNK
post
Post #14





Grupa: Zarejestrowani
Postów: 93
Pomógł: 5
Dołączył: 30.04.2006
Skąd: Gliwice

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


No to czas chyba coś napisać winksmiley.jpg

1) Upewnij się że masz włączoną bibliotekę mysqli tongue.gif (co mniemam już zrobiłeś i jest to zbyteczne, ale warto wspomnieć winksmiley.jpg )

2) U mnie wszystko działa ok, więc nie jest to wina ani skryptu, ani struktury tabeli. Będzie to zatem wina oprogramowania winksmiley.jpg
Z tym raczej będziesz musiał poradzić sobie sam. Może że jakieś ważne ustawienia są które to blokują, ale tego to ja już nie wiem
Go to the top of the page
+Quote Post
Maf
post
Post #15





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 16.10.2006

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


1. mam mysqli wkompilowane specjalnie do mysql'a, bo już przy pierwszym podejściu narzekał na brak klasy jakiejśtam, także to nie to.
2. mówisz że Ci działa, hm winksmiley.jpg czyli to wina mojego softu raczej.

Każdy kto ma chwilkę wolną, niech sprawdzi czy u niego działa, a jeśli przypuszczacie ze to wina configu, to dajcie znać co to może być;]

EDIT:
Jest postęp, zainstalowałem na desktopie php i mysql'a (tym razem w wersji 5.*) i problem zniknął smile.gif Niedługo sprawdzę to także na felernym serwerze, aktualizuję właśnie mysql'a.

Ten post edytował Maf 17.10.2006, 18:53:24
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 - 20:04