hallo, ik wil een record wegschrijven met een zinnetje weer
bv. "het is vandaag 10° en mooi weer"
indien ik dit bijwerkt of wegschrijft in de MYSQL database krijg ik het volgende te zien
"het is vandaag 10"
Alles achter de 10 wordt niet weggeschreven
wat kan daar de oorzaak van zijn?

Groet Jonet
Kan je jouw relevante code geven?
Klinkt als een character encoding probleem.

Welke character encoding gebruik je:
- in het HTML-document waarin je dit weergeeft?
- bij het maken van de database-connectie? (m.b.v. set_charset)
- verder is het handig, maar niet per se noodzakelijk, dat al deze character encoderingen min of meer gelijk zijn (dus bijvoorbeeld UTF-8 in het document, en "utf8" bij het maken van een database-connectie)

Of mogelijk heeft de kolom in de database-tabel te weinig plek voor deze tekst.
Hoe luidt de definitie van de databasetabel/-kolom?

Of misschien gebruik je een afwijkende character encoding bij het weergeven/escapen van deze output? Maar dan zou ik eigenlijk verwachten dat je geen output te zien krijgt.

Het blijft inderdaad koffiedik kijken zonder enige relevante code.
Ik ben niet zo heel goed thuis nog in werken met databases...

code ziet er zo uit


<?php

$sleutel = "2357981";
$weer = "vandaag 23° en mooie zonnige dag";
$mysql_table = "weer";

# Database openen om DB aan te spreken.
$db = new mysqli($mysql_server, $mysql_username, $mysql_password);
$db->select_db($mysql_database);

# Correcte weergave vreemde karakters in unicode
$db->set_charset("utf8");

$query = ("INSERT INTO $mysql_table (sleutel, weer) VALUES ('$sleutel', $weer);");

$results = $db->query($query);

// resultaat : "vandaag 23" ipv "vandaag 23° en mooie zonnige dag"

if($results === false) {
echo $db->error . "<br>"; # fouten laten zien in browser
$QueryError = true;
}
else {
# Insert is gelukt. gegevens laten zien in browser.
echo "<tr><td>$sleutel</td><td>$weer</td></tr><br>";
}

# Sluiten database
$db->close();

?>


    $query = ("INSERT INTO $mysql_table (sleutel, weer) VALUES ('$sleutel', $weer);");


Ik raad aan om het eens te escapen:


    $query = "INSERT INTO $mysql_table (sleutel, weer) 
		VALUES (
			'".$db->real_escape_string($sleutel)."',
		    '".$db->real_escape_string($weer)."'
			)
			";

En wat is de encoding van dat stukje PHP script (moet dus ook UTF8 - zonder BOM - zijn).

Dat escapen is een zeeeeer goed gewoonte, maar gaat je probleem niet oplossen.
Wel als hij een ' zou gebruiken in zijn string. Dan stopt de query ermee...
Ja, dan wel. Maar het probleem is nu dat alles na het gradenteken niet wordt opgeslagen, en daarmee heeft escaping niks van doen.

Als die $sleutel bijvoorbeeld het resultaat is van $x * $y (dus altijd numeriek), en het veld `weer` is ook een numeric veld, dan heeft escaping ook totaal geen toegevoegde waarde.

Maar dat is hier al 100k keer voorbij gekomen, dus leek me niet nodig om hier nogmaals te herkauwen, omdat het (vermoedelijk - vooruit dan, hou ik toch een slag om de arm) niks mee te maken heeft.
Als het letterlijk een tekststring is in het PHP-bestand zelf, dan ligt het waarschijnlijk aan de manier waarop het bestand is opgeslagen. Als dit niet met een UTF-8 encodering gebeurt dan gaat dat graden-teken waarschijnlijk door de vleesmolen omdat je met set_charset() (tevens) aangeeft dat alle data die je aan de database aanlevert ook UTF-8 is (of zou moeten zijn). PHP is verder redelijk "doof" voor character encoderingen, deze is enkel geïnteresseerd in bytes.

Escapen (in combinatie met quotes) is altijd een goed idee, maar dat is naar alle waarschijnlijkheid niet het probleem hier.

Dus, mogelijke oplossing: sla het PHP-bestand op met UTF-8 encodering. De meeste editors (en volgens mij kon Notepad dit zelfs) bieden deze mogelijkheid wel, en kun je zelfs per bestandstype vastleggen wat de encodering standaard zou moeten zijn, zodat je dit ook nooit meer fout doet :).
Hm... ik heb overigens nog nooit afgebroken strings gezien door UTL-8 troubles?
Hoogstens vraagtekens of vraagtekens in ruitjes.
Wanneer je het PHP-bestand opslaat als ISO-whatever dan krijg je idd een ? in je database, en niet een afgebroken string.

Misschien is er te weinig ruimte in de kolom - hoe luidt de tabeldefinitie?

"vandaag 23" is precies tien karakters.

Normaal gesproken komt deze tekst ook uit een formulier of wat dan ook, en is het geen statische tekst in een PHP-bestand lijkt mij?

Reageren