Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Problem z nową wersją MariaDB
Forum PHP.pl > Forum > Przedszkole
gloweres
Dzień dobry wszystkimi.
Na hostingu którego używam od uzywałem MariaDB 10.1 lecz za niedługo wersja ta zostanie wyłączona i jedyną opcją jest MariaDB 10.5.
Na MariaDB 10.1 wszystko mi działało super lecz gdy zmieniam wersję na 10.5. to nie działa mi w ogóle wysyłanie informacji do bazy danych. Nie mogę edytować danych, wgrywać plików, dodawać danych.
Poniżej jest kod jaki używam na stronie do dodawania informacji do kolumn w tabeli. Bardzo proszę o pomoc co robię nie tak.

Plik dbsoft.php:

  1. <?php
  2. $dsn = 'mysql:host=XXXXXX;dbname=XXXXXX;charset=utf8';
  3. $username = 'XXXXXX';
  4. $password = 'XXXXXX';
  5. $options = [];
  6. try {
  7. $connection = new PDO($dsn, $username, $password, $options);
  8. } catch(PDOException $e) {
  9.  
  10. }
  11. ?>

Kod dodawania imienia i nazwiksa do bazy. VALUES ('{$_POST['1']}', '{$_POST['2']}')"; wczytuje z innej podstrony.
  1. <?php
  2.  
  3. require '../funkcje/database_connect/dbsoft.php';
  4.  
  5. $sql = "INSERT INTO `database` (nazwisko, imie)
  6. VALUES ('{$_POST['1']}', '{$_POST['2']}')";
  7.  
  8. $statement = $connection->prepare($sql);
  9.  
  10. if (!$statement) {
  11. echo "\nPDO::errorInfo():\n";
  12. print_r($dbh->errorInfo());
  13. }
  14.  
  15. if ($statement->execute()) {
  16.  
  17. echo '<p class="text-success">Pozytywnie dodano osobę</p>';
  18.  
  19. }
  20.  
  21. ?>


Błąd jaki zwraca strona:

  1. Fatal error: Uncaught Error: Call to a member function prepare() on null in /home/server100024/ftp/skb/pliki/cos.php:8 Stack trace: #0 {main} thrown in /home/server100024/ftp/skb/pliki/cos.php on line 8
viking
Problem masz w połączeniu. W linii 9 pierwszego kodu dodaj echo $e->getMessage();
gloweres
Błąd był spowodowany złym linkiem do bazy. Lecz teraz gdy to poprawiłem wyświetla się białą strona i nic sie nie dodaje do bazy. Gdy tylko zmieniam na wersje 10.4 wszystko działa jak trzeba lecz za tydzień nie będzie ona już dostępne więc muszę przejść na wersję 10.5.
viking
Biała strona to jakiś błąd 500. Sprawdź logi. Po co robisz prepare w którym na sztywno wkładasz post?
gloweres
Nie ma żadnego błędu w logach, wszędzie status 200, więc wszystk dobrze. Połączenie z bazą na pewno jest dobre bo wyświetlają się informację pobierane z bazy lecz nie działa własnie wysyłanie, zmienianie od stronki. Wszystko działa jak trzeba na wersji 10.1-10.4 lecz na 10.5 właśnie są te problemy. Ktoś wie jaki może być problem?
viking
A jakie logi konkretnie sprawdzasz? Włącz pełne raportowanie błędów (przyklejony temat).
gloweres
Znalazłem błąd, w nowej wersji mardiaDB pustych pól nie zamienia automatycznie na null w bazie. Trzeba nadać im jaką kolwiek wartość (chodzi np o date lub int). Wie może ktoś jak do tego kodu zaimplementować poprawnie:

  1. $pole1 = (!empty($_POST['cos1'])) ? $_POST['cos1'] : null;

Żeby np jak dodaje wartość int albo date automatycznie dawało do bazy 0 lub null? Bo problem dotyczył jak chciałem zostawić puste pole w int lub date (w poprzednich wersjach mariadb nie było tego problemu bo baza sama dawała date 0000-00-00 lub int 0 jak pole było puste.
viking
A dlaczego nie ustawisz w bazie wartości domyślnych dla pól skoro czegoś oczekujesz domyślnie? Nie było by problemu gdybyś pisał porządnie swój kod.
https://mariadb.com/kb/en/sql-mode/
PS data 0000-00-00 również nie jest poprawna i generuje domyślnie warning.
gloweres
Jestem początkujący i dopiero się uczę dlatego pewnie takie błędu. Jak powinno to wyglądać w kodzie. Jak zdefiniowałem w bazie wartość pola int na 0 to dalej jest błąd:
SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect integer value: '' for column `server100024_pliki4`.`database`.`kwota_wpisowego` at row 1
Więc muszę z poziomu kodu to zdefiniować (tego wymaga mariadb w wersji 10.5)
viking
Jeżeli masz ustawione wartości domyślne to je pomijaj podczas insert w zapytaniu. A skoro nie znasz daty to nie może być nullem? No i mam nadzieję że potrawie to dziurawe prepare które pokazałeś na początku. Żadnych danych bezpośrednio w zapytaniu.
gloweres
Trochę nie rozumiem o co chodzi z tym prepare? Co powinienem poprawić? Czemu jest źle?
viking
Jest źle to że nie podstawiasz w nim żadnych wartości przez placeholder tylko wstrzykujesz dane użytkownika. Podatne na sql injection. Masz przecież w dokumentacji opisane jak używać.
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.