MySql ÅÄÖ fungerar ej

MySql ÅÄÖ fungerar ej

Hej jag har gjort en php-fil där man uppdaterar information i en databas men när man skriver in Å, Ä eller Ö så läggs ej detta till.

PHP-kod

<?php include 'config.php'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset="UTF-8" /> <link href="<?php echo $design; ?>/style.css" rel="stylesheet" title="Style" /> <title>Redigera Elevinformation</title> </head> <body> <div class="header"> <?php include 'default/header.php'; ?> </div> <div class="content"> <?php if(isset($_SESSION['username'])) { $dn = $connect->query('select username, admin from teachers where username="'.$_SESSION['username'].'"'); $dnn = mysqli_fetch_array($dn); if($dnn['admin']="yes") { ?> <?php if(isset($_POST['first_name'], $_POST['last_name'], $_POST['parents'])) { if(get_magic_quotes_gpc()) { $_POST['first_name'] = stripslashes($_POST['first_name']); $_POST['last_name'] = stripslashes($_POST['last_name']); $_POST['parents'] = stripslashes($_POST['username']); $_POST['adress'] = stripslashes($_POST['password']); $_POST['parents_number'] = stripslashes($_POST['passverif']); $_POST['parents_email'] = stripslashes($_POST['email']); $_POST['pers_nr'] = stripslashes($_POST['avatar']); } $first_name = $connect->real_escape_string($_POST['first_name']); $last_name = $connect->real_escape_string($_POST['last_name']); $pers_nr = $connect->real_escape_string($_POST['pers_nr']); $class = $connect->real_escape_string($_POST['class']); $adress = $connect->real_escape_string($_POST['adress']); $parents = $connect->real_escape_string($_POST['parents']); $parents_number = $connect->real_escape_string($_POST['parents-number']); $parents_email = $connect->real_escape_string($_POST['parents-email']); $parent2 = $connect->real_escape_string($_POST['parent2']); $parent2_number = $connect->real_escape_string($_POST['parent2-number']); $parent2_email = $connect->real_escape_string($_POST['parent2-email']); $annan = $connect->real_escape_string($_POST['annan']); $annan_number = $connect->real_escape_string($_POST['annan-number']); $hamtning = $connect->real_escape_string($_POST['hamtning']); $allergy = $connect->real_escape_string($_POST['allergy']); $about = $connect->real_escape_string($_POST['about']); $id = $_GET['id']; if($connect->query('update students set first_name="'.$first_name.'", last_name="'.$last_name.'", pers_nr="'.$pers_nr.'", class="'.$class.'", adress="'.$adress.'", parents="'.$parents.'", parents_number="'.$parents_number.'", parents_email="'.$parents_email.'", parent2="'.$parent2.'", parent2_number="'.$parent2_number.'", parent2_email="'.$parent2_email.'", annan="'.$annan.'", annan_number="'.$annan_number.'", hamtning="'.$hamtning.'", allergy="'.$allergy.'", about="'.$about.'" where id="'.$id.'"')) { $form = false; ?> <div class="message">Informationen har uppdaterats.<br /> <a href="student.php?id=<?php echo $_GET['id']; ?>">Visa elevsida</a></div> <?php } else { $form = true; $message = 'Ett fel intr&auml;ffade, kontakta systemansvarig.'; } } else { $form = true; } if($form) { if(isset($message)) { echo '<div class="message">'.$message.'</div>'; } ?> <?php } } else { header("Location: home.php"); } } else { header("Location: login.php"); } ?> </div> <div class="foot"><font color="#FFF">&copy; FOOTER</font></div> </body> </html>

Tacksam för svar

Vad har du satt för charset i din databas?

Skrivet av Dreadlock:

Vad har du satt för charset i din databas?

Det är UTF-8_genaral_ci, om jag lägger till information via phpMyadmin så fungerar det att ha med Å,Ä och Ö

Och har du specificerat UTF8 i din connector?

Skrivet av hampuz13:

Hej jag har gjort en php-fil där man uppdaterar information i en databas men när man skriver in Å, Ä eller Ö så läggs ej detta till.

PHP-kod

<?php include 'config.php'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset="UTF-8" /> <link href="<?php echo $design; ?>/style.css" rel="stylesheet" title="Style" /> <title>Redigera Elevinformation</title> </head> <body> <div class="header"> <?php include 'default/header.php'; ?> </div> <div class="content"> <?php if(isset($_SESSION['username'])) { $dn = $connect->query('select username, admin from teachers where username="'.$_SESSION['username'].'"'); $dnn = mysqli_fetch_array($dn); if($dnn['admin']="yes") { ?> <?php if(isset($_POST['first_name'], $_POST['last_name'], $_POST['parents'])) { if(get_magic_quotes_gpc()) { $_POST['first_name'] = stripslashes($_POST['first_name']); $_POST['last_name'] = stripslashes($_POST['last_name']); $_POST['parents'] = stripslashes($_POST['username']); $_POST['adress'] = stripslashes($_POST['password']); $_POST['parents_number'] = stripslashes($_POST['passverif']); $_POST['parents_email'] = stripslashes($_POST['email']); $_POST['pers_nr'] = stripslashes($_POST['avatar']); } $first_name = $connect->real_escape_string($_POST['first_name']); $last_name = $connect->real_escape_string($_POST['last_name']); $pers_nr = $connect->real_escape_string($_POST['pers_nr']); $class = $connect->real_escape_string($_POST['class']); $adress = $connect->real_escape_string($_POST['adress']); $parents = $connect->real_escape_string($_POST['parents']); $parents_number = $connect->real_escape_string($_POST['parents-number']); $parents_email = $connect->real_escape_string($_POST['parents-email']); $parent2 = $connect->real_escape_string($_POST['parent2']); $parent2_number = $connect->real_escape_string($_POST['parent2-number']); $parent2_email = $connect->real_escape_string($_POST['parent2-email']); $annan = $connect->real_escape_string($_POST['annan']); $annan_number = $connect->real_escape_string($_POST['annan-number']); $hamtning = $connect->real_escape_string($_POST['hamtning']); $allergy = $connect->real_escape_string($_POST['allergy']); $about = $connect->real_escape_string($_POST['about']); $id = $_GET['id']; if($connect->query('update students set first_name="'.$first_name.'", last_name="'.$last_name.'", pers_nr="'.$pers_nr.'", class="'.$class.'", adress="'.$adress.'", parents="'.$parents.'", parents_number="'.$parents_number.'", parents_email="'.$parents_email.'", parent2="'.$parent2.'", parent2_number="'.$parent2_number.'", parent2_email="'.$parent2_email.'", annan="'.$annan.'", annan_number="'.$annan_number.'", hamtning="'.$hamtning.'", allergy="'.$allergy.'", about="'.$about.'" where id="'.$id.'"')) { $form = false; ?> <div class="message">Informationen har uppdaterats.<br /> <a href="student.php?id=<?php echo $_GET['id']; ?>">Visa elevsida</a></div> <?php } else { $form = true; $message = 'Ett fel intr&auml;ffade, kontakta systemansvarig.'; } } else { $form = true; } if($form) { if(isset($message)) { echo '<div class="message">'.$message.'</div>'; } ?> <?php } } else { header("Location: home.php"); } } else { header("Location: login.php"); } ?> </div> <div class="foot"><font color="#FFF">&copy; FOOTER</font></div> </body> </html>

Tacksam för svar

Tjo!

Jag hade det problemet när jag höll på med att skapa en databas-styrd webbsida när jag gick i skolan. Provade att lägga till

mysqli_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

efter anslutningen till MySQL och verkade fungera sen. Hittade det någonstans. Men du kan först prova:

mysqli_set_charset($con,"utf8");

Källa: http://www.w3schools.com/php/func_mysqli_set_charset.asp
Syntax:

mysqli_set_charset(connection,charset);

Skrivet av Dreadlock:

Och har du specificerat UTF8 i din connector?

Fattade inte riktigt vad du menade men min config.php ser ut såhär

<?php session_start(); $connect = mysqli_connect('XXXXXXXXXX', 'XXXXXXXXXXXXXX', 'XXXXXXXXXXXXX'); mysqli_connect('XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXX', 'XXXXXXXXXXXXX'); mysqli_select_db($connect, 'XXXXXXXXXXXx_rs1'); ?> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> </html>

Senast redigerat 2016-05-19 11:53: Känsliga uppgifter raderade. // MOD
Skrivet av hampuz13:

Fattade inte riktigt vad du menade men min config.php ser ut såhär

<?php session_start(); $connect = mysqli_connect('XXXXXXXXXX', 'XXXXXXXXXXXXXX', 'XXXXXXXXXXXXX'); mysqli_connect('XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXX', 'XXXXXXXXXXXXX'); mysqli_select_db($connect, 'XXXXXXXXXXXx_rs1'); ?> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> </html>

Jag rensade bort känsliga uppgifter ur ditt inlägg. Du gör bäst i att byta lösenord för din databas omedelbart.

Skrivet av Daemon:

Jag rensade bort känsliga uppgifter ur ditt inlägg. Du gör bäst i att byta lösenord för din databas omedelbart.

Tack
Glömde helt av att ta bort dessa

du skriver inte att databasen ska connecta med utf8

Skrivet av davvarn:

Tjo!

Jag hade det problemet när jag höll på med att skapa en databas-styrd webbsida när jag gick i skolan. Provade att lägga till

mysqli_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

efter anslutningen till MySQL och verkade fungera sen. Hittade det någonstans. Men du kan först prova:

mysqli_set_charset($con,"utf8");

Källa: http://www.w3schools.com/php/func_mysqli_set_charset.asp
Syntax:

mysqli_set_charset(connection,charset);

Hej! jag har lagt till

$connect->query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

efter anslutningen i config.php men det funkar ändå inte

Skrivet av hampuz13:

Fattade inte riktigt vad du menade men min config.php ser ut såhär

<?php session_start(); $connect = mysqli_connect('XXXXXXXXXX', 'XXXXXXXXXXXXXX', 'XXXXXXXXXXXXX'); mysqli_connect('XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXX', 'XXXXXXXXXXXXX'); mysqli_select_db($connect, 'XXXXXXXXXXXx_rs1'); ?> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> </html>

Inte relaterat till frågan, men varför kör du mysqli_connect() två gånger?

Skrivet av hampuz13:

Hej! jag har lagt till

$connect->query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

efter anslutningen i config.php men det funkar ändå inte

Okej. Även provat det som jag skrev nedanför det du lade in?

mysqli_set_charset($con,"utf8");

eller i ditt fall -->

mysqli_set_charset($connect,"utf8");

@hampuz13: magic_quotes_gpc är borttaget från moderna versioner av PHP (blev deprecated redan i 5.3); kontrollera om du verkligen behöver titta efter och filtrera formuläret på det där sättet. Även om det är en äldre miljö så överväg om det inte är smidigare att stänga av det globalt istället för att behöva hantera för varje enskilt formulär.

Du kan även bespara dig en del skrivande (och samtidigt minska risken för misstag, i koden ovan kan t.ex. inte värdet hanteras korrekt av real_escape_string() om teckenkodningen inte stämmer) genom att använda "prepared statements" istället för att att manuellt escapa varje enskild parameter och formatera SQL-frågor som strängar, både ext/mysqli och PDO har stöd för det, men PDO:s gränssnitt kan vara lite smidigare att arbeta med:

// Öppna en ny anslutning till databasen: $conn = new PDO("mysql:dbname=test;host=localhost;charset=utf8mb4", "username", "password"); // Generera ett undantag om något går fel: $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Använd databasens eget stöd för prepared statements: $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // Indentera din SQL: $conn->prepare(" UPDATE students SET first_name = ?, last_name = ?, pers_nr = ?, class = ?, adress = ?, parents = ?, parents_number = ?, parents_email = ?, parent2 = ?, parent2_number = ?, parent2_email = ?, annan = ?, annan_number = ?, hamtning = ?, allergy = ?, about = ? WHERE id = ?;") ->execute([ $first_name, $last_name, $pers_nr, $class, $adress, $parents, $parents_number, $parents_email, $parent2, $parent2_number, $parent2_email, $annan, $annan_number, $hamtning, $allergy, $about, $id ]);

PDO

För ext/mysqli blir exemplet så här:

$conn = mysqli_connect("127.0.0.1", "username", "password", "test"); $conn->set_charset("utf8mb4"); $stmt = $conn->prepare(" UPDATE students SET first_name = ?, last_name = ?, pers_nr = ?, class = ?, adress = ?, parents = ?, parents_number = ?, parents_email = ?, parent2 = ?, parent2_number = ?, parent2_email = ?, annan = ?, annan_number = ?, hamtning = ?, allergy = ?, about = ? WHERE id = ?;"); $stmt->bind_param( "ssssssssssssssssi", $first_name, $last_name, $pers_nr, $class, $adress, $parents, $parents_number, $parents_email, $parent2, $parent2_number, $parent2_email, $annan, $annan_number, $hamtning, $allergy, $about, $id ); $stmt->execute(); $stmt->close();

ext/mysqli

Den här kommentaren påverkar inte ditt problem ovan, men observera även att man i MySQL måste göra skillnad på teckentabellerna 'utf8' och 'utf8mb4'. Den som kallas 'utf8' kan bara hålla tecken upp till tre byte långa, medans 'utf8mb4' har full täckning (och t.ex. klarar av att beskriva emojis). Använd 'utf8mb4' såvida du inte har goda skäl att göra något annat. Och det här kanske blir lite överkurs nu, men alla bytesekvenser inte är giltig UTF-8 och du bör validera inte bara längd utan även teckenkodning innan du skickar strängar vidare till databasen (och om databasen bara använder 3 byte långa tecken måste du kontrollera att inga längre förekommer i texten). Det går att använda mb_check_encoding() för att testa det:

if(mb_check_encoding("\xC3\xB6", "UTF-8")) { // OK: C3 B6 är ett 'ö' } if(mb_check_encoding("\xF0\x9F\x96\xAA", "UTF-8")) { // OK: F0 9F 96 AA är en symbol för en diskett (🖪) // VARNING: Går inte att lagra i MySQL:s 'utf8', använd 'utf8mb4' } if(mb_check_encoding("\xFF\x00", "UTF-8")) { // ERROR: FF 00 är inte giltig UTF-8 och databasen kommer neka värdet }

Överkurs

11.1.11.5 The utf8 Character Set (3-Byte UTF-8 Unicode Encoding)
11.1.11.7 The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)

Sedan en liten reflektion över själva tabellstrukturen: Först blandas olika namnformer, en del kolumner är på svenska, andra är på engelska, "parents" anges som plural men samtidigt finns det en "parent2". Det blir svårt att komma ihåg vad kolumner heter på det sättet, efter hand kommer man spendera onödigt mycket tid med att slå upp hur den såg ut. Sedan beskriver den egentligen relationer mellan olika personer: eleven, föräldrar / vårdnadshavare / etc., om du har tid och behov så kan du antagligen dela upp det på sätt som utnyttjar databasen bättre, men food for thought om inte annat.


Skrivet av hampuz13:

... efter anslutningen i config.php men det funkar ändå inte

Du måste använda rätt teckentabell på din inskickade data, anslutningen till databasen, tabellen och kolumnen informationen ska lagras i (MySQL kommer försöka konvertera text till / från anslutningens teckentabell, men det är inte alltid möjligt), och när du granskar texten måste du se till att den tolkas med rätt teckentabell även där. (Tips: du kan använda SELECT HEX(kolumn) FROM dintabell; för att se det faktiska värdet, på PHP-sidan kan du använda bin2hex(), kan hjälpa till vid felsökning.) Hur yttrar sig problemet? Får du något felmeddelande? Sparas det någon data alls? Ser texten ut att innehålla felaktiga tecken när du senare granskar den?

Senast redigerat 2016-05-19 13:53

@Tunnelsork:

Hej!
jag har lagt till

$connect->set_charset("utf8mb4");

i config.php men då byts istället Å,Ä,Ö mot "?"

Skrivet av hampuz13:

i config.php men då byts istället Å,Ä,Ö mot "?"

Om det är ett vanligt "?" du ser (var? i fältet i databasen? hur tittar du på det? man kan aldrig vara för tydlig när man felsöker teckenkodningsproblem) så kan det uppstå om MySQL inte är konfigurerat med strict mode (hade det varit det så skulle det nekat ogiltiga värden) och din input innehåller sekvenser som inte är giltiga för den förväntade teckentabellen. Är din input t.ex. kodad som cp1252, där ett 'ö' representeras av F6, och anslutningen förväntar sig UTF-8 så är värdet ogiltigt.

Prova att inspektera formulärdatan med bin2hex(). Skicka bara in t.ex. "åäö" så att det blir lätt att identifiera enskilda tecken. Är det UTF-8 så kommer de antagligen se ut som C3 A5 (å), C3 A4 (ä), C3 B6 (ö), medan om det t.ex. är cp1252 så kommer de se ut som E5 (å), E4 (ä), F6 (ö). Klistra in förväntad text och motsvarande värden här så kan vi hjälpa till med att kontrollera om det är UTF-8 eller inte.

// Om resultatet blir string(12) "c3a5c3a4c3b6" så är strängen UTF-8 // Observera att du måste göra det med de inskickade formulärvärdena, en statisk sträng kommer använda källfilens teckenkodning var_dump(bin2hex("åäö"));

Senast redigerat 2016-05-20 00:08

@Biberu: Gammal tråd, men tack som fan!

@zajko: Tack själv, trevligt att det blev till nytta.

Necroar en gammal tråd men den kom upp när jag hade samma problem, såhär fixar man ÅÄÖ i PHP vs MySQL:

1. Se till att din databas har UTF8. De flesta som har ÅÄÖ problem har redan gjort detta.
2. Se till att din Putty kör UTF8 (standard).
3. Säg till mysqli att köra UTF8: $conn->set_charset("utf8");
4. Säg åt PHP att köra UTF8: mb_internal_encoding("utf-8");

Nu kommer ditt PHP script att fixa ÅÄÖ.

@Vexo:
4. Säg åt PHP att köra UTF8: mb_internal_encoding("utf-8");

Detta har i alla fall aldrig jag behövt göra.
Lägger bara till ett attribut, charset=utf8 i dsn-variabeln som ska in i PDO-objektet