Avatar billede nemlig Professor
14. april 2023 - 19:08 Der er 6 kommentarer og
2 løsninger

Deprecated: mysqli::real_escape_string()

Hejsa.
Jeg har et backup-script, som tager backup af tabellerne i en MySQL database.
Efter at PHP versionen er opdateret til 8.1, får jeg denne fejl, og som jeg ikke kan gennemskue løsningen på:

PHP Deprecated:  mysqli::real_escape_string(): Passing null to parameter #1 ($string) of type string is deprecated


Her er et lille udpluk at programkoden:
$r = 0;
            while ($row = $results->fetch_array()) {
                if (($r % 400)  == 0) {
                    $contents .= $insert_head;
                }
                $contents .= "(";
                for ($i=0; $i < $fields_count; $i++) {
                    $row_content =  str_replace("\n", "\\n", $mysqli->real_escape_string($row[$i]));
                    switch ($fields[$i]->type) {
                    case 8:
                    case 3:
                        $contents .=  $row_content;
                        break;
                    default:
                        $contents .= "'". $row_content ."'";
                }

                    if ($i < $fields_count-1) {
                        $contents  .= ', ';
                    }
                }

                if (($r+1) == $row_count || ($r % 400) == 399) {
                    $contents .= ");\n\n";
                } else {
                    $contents .= "),\n";
                }
                $r++;
            }

Den linje, der driller er:
$row_content =  str_replace("\n", "\\n", $mysqli->real_escape_string($row[$i]));

Nogen der kan gennemskue problemet og måske endda komme med et løsningsforslag.
Avatar billede arne_v Ekspert
14. april 2023 - 19:25 #1
real_escape_string er frarådet til brug i SQL da det er langt bedre at bruge prepare og parametre,

Men her ser det ud som om den bruges til noget andet.

Den bliver brugt til at konvertere data i forbindelse med backup.

Mit forsslag vil være at bruge str_replace til at lave tilsvarende erstatninger.

https://www.php.net/manual/en/mysqli.real-escape-string.php

siger:

Characters encoded are NUL (ASCII 0), \n, \r, \, ', ", and Control-Z.

og det må være overkommeligt at håndtere dem.
Avatar billede arne_v Ekspert
14. april 2023 - 19:35 #2
Har du iøvrigt overvejet at finde noget færdigt fremfor et gør-det-selv script?
Avatar billede nemlig Professor
14. april 2023 - 20:05 #3
#2 Tak for input. Jeg gør faktisk brug af et færdigt script, som jeg har lavet en smule omskrivning på, idet scriptet som udgangspunkt tager backup af alle tabeller. Her har jeg lavet lidt trylleri, så nogle bestemte tabeller ikke medtages i backupen. Men det har ikke noget med ovennævnte kode at gøre.

Scriptet er tudse gammelt, men har fungeret upåklageligt indtil for nyligt.

Har du evt. et forslag til ændret programkode eller mener du, at det er bedre at finde et backup-script, der er skrevet til nyere PHP version?
Avatar billede Slettet bruger
14. april 2023 - 21:27 #4
Hej. Jeg kan se, at du har et problem med din backup-script. Det ser ud til, at du får en fejl, fordi du bruger mysqli::real_escape_string () funktionen med et null parameter. Ifølge PHP dokumentationen², skal du angive både en forbindelse og en streng som parametre til denne funktion. Hvis du ikke gør det, vil funktionen returnere null.

En mulig løsning er at ændre din escapeInput () funktion til at tage et ekstra parameter $con, som er din mysqli forbindelse. Så kan du kalde mysqli::real_escape_string ($con, $data) i stedet for bare mysqli::real_escape_string ($data). Det burde løse problemet med den forældede advarsel.

Jeg håber, det hjælper dig. Hvis du har brug for mere hjælp, kan du prøve at søge på nettet efter lignende spørgsmål eller oprette dit eget spørgsmål på et forum som Stack Overflow¹.

Kilder:
(1) PHP: mysqli::real_escape_string - Manual.
https://www.php.net/manual/en/mysqli.real-escape-string.php

(2) Why mysqli_real_escape_string () returns NULL? - Stack Overflow.
https://stackoverflow.com/questions/27607118/why-mysqli-real-escape-string-returns-null

(3) PHP | mysqli_real_escape_string() Function - GeeksforGeeks.
https://www.geeksforgeeks.org/php-mysqli_real_escape_string-function/

(4) mysql_real_escape_string | Examples, Syntax and Parameters - EduCBA.
https://www.educba.com/mysql_real_escape_string/
Avatar billede Slettet bruger
14. april 2023 - 21:34 #5
Fejlmeddelelsen siger, at funktionen mysqli::real_escape_string() er forældet, og at det ikke er tilladt at sende en null-værdi til den første parameter.  Denne funktion bruges til at undgå specialtegn i en streng, så den sikkert kan bruges i en SQL-forespørgsel.

I din kode sender du værdien af ​​$row[$i]-variablen til funktionen mysqli::real_escape_string().  Denne variabel kan dog være nul, hvilket vil forårsage fejlmeddelelsen.

For at rette denne fejl skal du kontrollere værdien af ​​$row[$i]-variablen, før du sender den til mysqli::real_escape_string()-funktionen.  Hvis værdien er nul, kan du blot returnere den uden at undslippe den.

Her er den ændrede kode:

```php
$r = 0;
while ($row = $results->fetch_array()) {
    if (($r % 400) == 0) {
        $contents .= $insert_head;
    }
    $contents .= "(";
    for ($i = 0; $i < $fields_count; $i++) {
        $row_content = $row[$i];
        if ($row_content === null) {
            $row_content = '';
        }
        $row_content = str_replace("\n", "\\n", $row_content);
        switch ($fields[$i]->type) {
        case 8:
        case 3:
            $contents .= $row_content;
            break;
        default:
            $contents .= "'" . $row_content . "'";
        }

        if ($i < $fields_count - 1) {
            $contents .= ', ';
        }
    }

    if (($r + 1) == $row_count || ($r % 400) == 399) {
        $contents .= ");\n\n";
    } else {
        $contents .= "),\n";
    }
    $r++;
}
```

Denne kode vil kontrollere værdien af ​​$row[$i]-variablen, før den overføres til funktionen mysqli::real_escape_string().  Hvis værdien er nul, vil den blive returneret uden at undslippe den.  Dette vil rette fejlmeddelelsen og give din kode mulighed for at køre.
Avatar billede Slettet bruger
14. april 2023 - 21:38 #6
Eller fejlen du oplever skyldes, at mysqli::real_escape_string() metoden forventer en streng som parameter, men du sender muligvis en null værdi, hvilket er blevet deprecated (ikke længere anbefalet) i PHP 8.1.

Du kan løse dette problem ved at tilføje en ekstra check for at sikre, at værdien ikke er null før du kalder mysqli::real_escape_string() metoden. Her er en mulig løsning:



php

$row_content = '';
if ($row[$i] !== null) {
    $row_content =  str_replace("\n", "\\n", $mysqli->real_escape_string($row[$i]));
}



Dette vil sikre, at mysqli::real_escape_string() metoden kun kaldes, hvis værdien ikke er null, og dermed undgå fejlen du oplever i PHP 8.1. Du kan også overveje at bruge mysqli::escape_string() metoden i stedet, da den ikke forventer en streng som parameter og derfor ikke vil udløse deprecation-fejlen. Vær dog opmærksom på, at mysqli::escape_string() metoden ikke tager højde for tegnsætning, hvilket kan føre til problemer med specialtegn i din database. Det er derfor vigtigt at bruge mysqli::real_escape_string() eller anden form for beskyttelse mod SQL-injektion, når du indsætter data i en MySQL-database.
Avatar billede Slettet bruger
14. april 2023 - 21:39 #7
🤓👍🙃 Hopper af
Avatar billede nemlig Professor
14. april 2023 - 22:01 #8
Super gode tilbagemeldinger.
#5 Det fungerer nu.

#2 Jeg har nu hentet et nyt og færdigt script, og som jeg er ved at tilpasse.
https://phppot.com/php/how-to-backup-mysql-database-using-php/

Tusinde tak for jeres input :).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester