Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nowy rekord dodaje się do bazy w dziwny sposób (php + MySQL)
Forum PHP.pl > Forum > PHP
Maf
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ł?
1010
Kod który pokazałeś jest tylko odpowiedzialny za przekazanie danych do klasy... musisz pokazać klasę która to wykonuje...
Pozdro
siemakuba
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.
batman
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).
Maf
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
siemakuba
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.
Maf
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);
?>
siemakuba
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.
Maf
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
siemakuba
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.
Maf
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.
siemakuba
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.
Maf
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;
?>
UNK
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
Maf
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.
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.