underscores in php serialize array gaat weg

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Daniel van Seggelen

Daniel van Seggelen

26/06/2022 00:47:26
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Array ( [0] => 749_3 [1] => 845_4


Als ik hem met serialize wegschrijf in een mysql database en dan terughjaal met unserialize, dan krijg ik

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Array ( [0] => 749 [1] => 845


Waarom?
 
PHP hulp

PHP hulp

09/11/2024 03:35:16
 
Jan R

Jan R

26/06/2022 06:42:23
Quote Anchor link
Veldtype?

Onderstaande test werkt voor mij perfect
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    $a = Array ('749_3', '845_4');
    p($a);
    
    $b = json_encode($a);
    p($b);
    
    $sql = 'insert into test(txt) values("' . mysqli_real_escape_string($con, $b) . '");';
    p($sql) ;
    $ret = mysqli_query($con, $sql);
    if($ret) {
        $id = mysqli_insert_id($con);
        $sql = 'select * from test where id=' . $id;
        $ret2 = mysqli_query($con, $sql);
            
        if($ret2) {
            $c = mysqli_fetch_assoc($ret2);
            p($c);
            $d= json_decode($c['txt']);
            p($d);
        }            
    }else{
        echo 'niet opgeslagen in db. ' . mysqli_error($con);
    }
 
Rob Doemaarwat

Rob Doemaarwat

26/06/2022 11:32:44
Quote Anchor link
Als je dit letterlijk zo opschrijft:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Array ( [0] => 749_3 [1] => 845_4)
dan interpreteert PHP deze waarden als getallen. Dat doet ie net zo lang tot het goed gaat. "749_3" wordt dan 749.

Als je dit letterlijk zo wilt bewaren, dan moet je er quotes omheen zetten, zodat het als een string wordt opgeslagen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Array ( [0] => '749_3' [1] => '845_4')
 

27/06/2022 09:41:20
Quote Anchor link
De oorzaak van het probleem is PHP én MySQL. Ze zijn allebei 'weakly typed'. Het betekent dat ze voor de voor de programmeur proberen te verbergen wat het data type is. Hierdoor heeft de programmeur doorgaans geen goed idee van wat hij/zij aan het doen is.

PHP maakt er helemaal een zootje van. Omdat het vanuit allerlei hoeken en gaten functies aan elkaar knoopt is consistentie afhankelijk van de programmeur zelf. Er zijn een paar basistypen waar je rekening mee moet houden, zoals of iets een nummer is of tekst. (zie ook https://www.php.net/manual/en/language.types.intro.php) Maar hoeveel data er in een nummer pas hangt weer af van de computer waarop PHP draait. En hoe precies een nummer is hangt weer af van andere instellingen. Hoe een nummer wordt weergegeven hangt af van verschillende locale instellingen. Allemaal dingen waar je zelf rekening mee moet houden, de taal PHP helpt je niet. Om het nog onoverzichtelijker te maken doet PHP aan impliciete type casting, wat inhoudt dat het type gegeven verandert waar je bij staat: schrijf je in PHP iets als 'Dit getal is: ' . $getal, en $getal bevat 749,3, dan maakt PHP daar een byte reeks van. Welke bytes het worden moet je nog uitzoeken ook, want PHP is ook nog in staat om automatische transcoding te doen, dat hangt ook weer af van de PHP instellingen. Weinig overzichtelijk dus.

MySQL is niet veel beter. MySQL heeft hezelfde euvel als PHP, het is ook weakly typed. En net als met PHP hangt het gedrag van MySQL af van allerlei instellingen waar je geen weet van hebt als je MySQL net hebt geïnstalleerd of afneemt van een hoster.

De antwoorden die net gegeven zijn, zijn misschien juist. Maar dat is nu niet zeker te weten, omdat je niet precies hebt aangegeven wat aan het doen bent.
Een van de dingen die je niet hebt aangegeven, is waarmee de data wordt serialiseerd. Want ook dat.. is weer afhankelijk van wat je aan het doen bent in PHP. Van welke serialiser maak je gebruik? ( https://www.php.net/manual/en/class.serializable.php )? Zijn gegevens opgeslagen in $_SESSION? Zo ja, van welke sessie handler maak je gebruik? ( https://www.php.net/manual/en/session.customhandler.php )

Dus ik zou willen vragen of je je probleem met meer achtergrondinformatie over de schutting wilt gooien. En: wat heb je zelf al geprobeerd? Waar loop je tegenaan?
Gewijzigd op 27/06/2022 09:45:18 door
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.