Przejście z php 5.2 do php7 - błędy...

0

Witam.
Przerabiam własnie całąstronę na php7, ponieważ za niedługo mój usługodawca wyłączy php 5.2 i pozostanie "7-mka".

Na dzień dobry mam mały problem z zapytaniem:

$query=mysqli_query($sql="$con, DELETE FROM {$this->session_tbl} WHERE session_end<".time()); 

Otrzymuję błąd:

Catchable fatal error: Object of class mysqli could not be converted to string

$con to połączenie z bazą... czyli

$db_host = '...';
$db_user = '...'; 
$db_pass = '...';
$db_name = '...';
$con = mysqli_connect($db_host, $db_user, $db_pass, $db_name) or die( 'BŁĄD POŁĄCZENIA z MySQL');

Co jest nie tak?

1

@exxec szukać się nie chce? :)

mixed mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )
(...)
link
Procedural style only: A link identifier returned by mysqli_connect() or mysqli_init()

To jest jakaś dziwna składnia i nie miało to prawa działać.

$sql="$con, DELETE FROM {$this->session_tbl} WHERE session_end<"

// zamiast tego zrób
$query=mysqli_query($con, "DELETE FROM {$this->session_tbl} WHERE session_end<".time()); 
0
exxec napisał(a):

Witam.
Przerabiam własnie całąstronę na php7,
(...)

$query=mysqli_query($sql="$con, DELETE FROM {$this->session_tbl} WHERE session_end<".time()); 


Ciekawe, przecież to nie miało prawa działać również na php 5
0

Sprawdzałem... na 5.2 działało... a już na 5.3 nie. Teraz już jest OK.

Większość starych zapytań (te, które działały na 5.2) nie chcą hulać na "7-mce".
Na przykład:

$result = mysqli_query($con, "SELECT * FROM forum_a WHERE topic='-' ORDER BY reply DESC LIMIT $limit");
$r = mysqli_fetch_object($result);

a także

$query = "SELECT * FROM forum_a WHERE topic='-' AND cat <> 14 ORDER BY reply DESC LIMIT $limit";
$result = mysqli_query($con, $query);
$tresc = mysqli_result(mysqli_query($con, "SELECT text FROM forum_b WHERE id='$id'"), 0);
$idsss = @mysqli_result(mysqli_query($con, "SELECT id FROM forum_a WHERE topic='$id' ORDER BY date DESC"), 0);
$tresc = @mysqli_result(mysqli_query($con, "SELECT text FROM forum_b WHERE id='$idsss'"), 0);

Ktoś...? Coś...?

0

Przepisz to do PDO (z użyciem bindowania parametrów do zapytania). Będzie działało, a ponadto nie wpakujesz się w SQL Injection.

0

Pokopałem trochę i znalazłem, gdzie był błąd:

if ($idsssIlosc==0) {
$tresc = mysqli_result(mysqli_query($con, "SELECT text FROM forum_b WHERE id='$id'"), 0);
}elseif($idsssIlosc>0) {

//$idsss = mysqli_result(mysqli_query($con, "SELECT id FROM forum_a WHERE topic='$id' ORDER BY date DESC"), 0);
$sql_idsss = "SELECT id FROM forum_a WHERE topic='$id' ORDER BY date DESC";
$idsss = mysqli_query($con, $sql_idsss);

//$tresc = mysqli_result(mysqli_query($con, "SELECT text FROM forum_b WHERE id='$idsss'"), 0);

$sql_tresc = "SELECT text FROM forum_b WHERE id='$idsss'"; // 471
$tresc = mysqli_query($con, $sql_tresc);
}

// edit
problem rozwiązany

0

@exxec zdajesz sobie sprawę, że mam dostęp do Twojej bazy danych? I każdy inny też?

0

W jaki sposób? Nie ma haseł nigdzie

0

sql injection... zmien to na np. $id = htmlspecialchars($id); albo addslashes() a najlepiej, PDO!

htmlspecialchars() nie rozwiaze problemu w 100%

0

Nigdy nie miałem do czynienia z PDO... Nie umiem, więc się za to nie biorę.
Jak Twoim zdaniem powinno to wyglądać?

0

SQL Injection polega na wstrzykiwaniu w zpaytanie SQL niechcianego dodatkowego zapytania, coś w stylu gdy $id obierze postać:

1' OR '2'

Jak masz w tej bazie użytkowników to może to skutkować wyciągnięciem haseł i tym podobnych wrażliwych danych.


jezeli juz sie upierasz przy mysqli_query to podałem Ci połowiczne rozwiązanie w postaci filtrowania tego co przyjmujesz za ID

bo to pewnie metoda $_POST, albo gorzej $_GET.

 $id = htmlspecialchars($id) 

Tylko tak jak napisałem to nie załatwi w 100% problemu bo to też można obejść. Już pokazuje jak wygląda MySQL PDO - przyjemniejsze:

Weźmy sobie na przykład to zapytanie:

SELECT id FROM forum_a WHERE topic='$id' ORDER BY date DESC;

W PDO wyglądałoby to tak:

//nowe połączenie pod zmienną pdo
$pdo = new PDO(
    'mysql:host=localhost;dbname=[TUTAJ DATABASE NAME]',
    'username',
    'password');

//pod zmienną $stmt przygotowujemy baze pod zapytanie
$stmt = $pdo->prepare('SELECT id FROM forum_a WHERE topic= :topic ORDER BY date DESC;');

//bindParam do zapytania wyżej, za :topic, wchodzi $id
$stmt->bindParam(':topic', $id);

//Wykonanie zapytania
$stmt->execute();

//FETCH - wiadomo co robi, jest także fetchAll()
$fetch = $stmt->fetch();

//zamykamy $stmt, połączenie z bazą dalej jest, można zrobic nowe $pdo->prepare (kolejne zapytanie)
$stmt->closeCursor();

//zamykamy całkowicie połączenie z bazą
$pdo = null;

var_dump($fetch);

Prawda że przyjemne? Zasada działania jest prosta, przygotowujesz sobie baze pod zapytanie, potem uzywasz bindParam(':param', $zmienna), ewentualnie bindValue(':param', 'value') a na koniec execute -> fetch -> closeCursor :) proste, przejrzyste i skuteczne :)

P.S. pisane z pamięci więc może wyskoczyć jakiś błąd

1 użytkowników online, w tym zalogowanych: 0, gości: 1