Permalänk
Medlem

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

Permalänk

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

Visa signatur

Eating fords and shitting chevys since 1914

Permalänk
Medlem
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 Ö

Permalänk

Och har du specificerat UTF8 i din connector?

Visa signatur

Eating fords and shitting chevys since 1914

Permalänk
Medlem
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);

Visa signatur

Chassi: Fractal Design Meshify C Mini | CPU: AMD Ryzen 5 3600 | Kylare: Be Quiet! Dark Rock Pro 4 | Graffe: ASUS 1070 8GB ROG STRIX DC3 | PSU: Corsair RM750X V2 | RAM: Corsair Vengence 32GB 3200 MHz | MOBO: MSI B450M MORTAR MAX
CS:GO-Maps (App) Sweclockers (App)

Permalänk
Medlem
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>

Känsliga uppgifter raderade. // MOD
Permalänk
Moderator
Moderator
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.

Visa signatur

*-<|:C-<-<

Nytt namn, samma bismak.

Permalänk
Medlem
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

Permalänk
Medlem

du skriver inte att databasen ska connecta med utf8

Visa signatur

Min dator: Silent Base 600 | 1700X @ 3.9Ghz | MSI Gaming X 1080TI | RM750X | 512Gb M2 | 16Gb 3200mhz Ram | S34E790C @ 3440x1440
Tjejens dator: Define r4 | i5 3570k @ 4.2ghz | GTX Titan | 750w Supernova | 240gb SSD | 32gb ram
Citera/Tagga för svar!

Permalänk
Medlem
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

Permalänk
Medlem
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?

Permalänk
Medlem
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");

Visa signatur

Chassi: Fractal Design Meshify C Mini | CPU: AMD Ryzen 5 3600 | Kylare: Be Quiet! Dark Rock Pro 4 | Graffe: ASUS 1070 8GB ROG STRIX DC3 | PSU: Corsair RM750X V2 | RAM: Corsair Vengence 32GB 3200 MHz | MOBO: MSI B450M MORTAR MAX
CS:GO-Maps (App) Sweclockers (App)

Permalänk
Legendarisk

@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?

Visa signatur

Abstractions all the way down.

Permalänk
Medlem

@Tunnelsork:

Hej!
jag har lagt till

$connect->set_charset("utf8mb4");

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

Permalänk
Legendarisk
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("åäö"));

Visa signatur

Abstractions all the way down.

Permalänk
Medlem
Permalänk
Legendarisk

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

Visa signatur

Abstractions all the way down.

Permalänk
Medlem

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 ÅÄÖ.

Permalänk
Medlem

@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