Avatar billede compac Seniormester
01. januar 2017 - 15:38 Der er 8 kommentarer og
1 løsning

Danske tegn i php og mysqli

Dette emne er der tærsket langhalm på i flere år, men jeg håber at kunne få hjælp alligevel. Efter at have rodet med at få de danske tegn på plads tænke jeg: "Nu begynder jeg helt forfra". Jeg fandt et lille system, som jeg afprøvede.
http://www.killersites.com/community/index.php?/topic/3064-basic-php-system-view-edit-add-delete-records-with-mysqli/

Der er een ting jeg rettede i oprettelsen af tabellerne:
CREATE TABLE `players` (
`id` int(11) NOT NULL auto_increment,
`firstname` varchar(32) NOT NULL,
`lastname` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

Jeg slettede DEFAULT CHARSET= latin1 så det blev:

CREATE TABLE `players` (
`id` int(11) NOT NULL auto_increment,
`firstname` varchar(32) NOT NULL,
`lastname` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 ;

Da jeg havde kørt den blev tegnsættet i PhpMyadmin utf8_danish_ci

Resultatet blev: I formularen står det korrekt:
First name: blåbærtærte

men i phpmyadmin-kolonnen står:

blåb&arlig;rt&relig;te

Dette har hele tiden været mit problem. Er det mon en parameter i Phpmyadmin der er forkert?
Avatar billede compac Seniormester
01. januar 2017 - 16:07 #1
Jeg skal lige uddybe: Det er Phpmyadmin ver. 4.5.5. på Windows10 og Apache2.

Resultatet er hvad jeg ser, efter jeg selv har tilføjet en post til formularen -  ordet: blåbærtærte.
Avatar billede expnet Seniormester
01. januar 2017 - 17:54 #2
Prøv med den her

mysql_real_escape_string()
Avatar billede compac Seniormester
01. januar 2017 - 21:31 #3
Jeg har prøvet at indsætte:
      $firstname= mysqli_real_escape_string($firstname);
    $lastname = mysqli_real_escape_string($lastname);
-men det giver samme resultat.

Jeg mener også, at det må betragtes som et tricks og ikke en løsning på problemet.
Avatar billede olsensweb.dk Ekspert
01. januar 2017 - 22:26 #4
#3 får du ikke en fejl i mysqli_real_escape_string ??
den burde brokke sig over du mangler en connection
mysqli_real_escape_string har vist ikke noget med dit charset at gøre
http://php.net/manual/en/mysqli.real-escape-string.php

har du sat charset på din connection ??
http://php.net/manual/en/mysqli.set-charset.php


du bør sætte collation på dine collonner, og charset på din tabel,

CREATE TABLE `players` (
`id` int(11) NOT NULL auto_increment,
`firstname` varchar(32) NOT NULL,
`lastname` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 ;




CREATE TABLE `players` (
  `id` int(11) NOT NULL,
  `firstname` varchar(32) COLLATE utf8_danish_ci NOT NULL,
  `lastname` varchar(32) COLLATE utf8_danish_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

ALTER TABLE `players`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `players`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;


ref http://www.computerworld.dk/eksperten/spm/974414?k=8015167
citat
Allerede bestående indhold ændres ikke, hvis du ændrer databasens tegnsæt og/eller tabellernes kollationer. Kun nyt indhold, indsat efter ændringen, vil være utf-8
/citat
læs også
http://www.computerworld.dk/eksperten/spm/943684?k=7813511
http://www.computerworld.dk/eksperten/spm/943684?k=7813517



phpmyadmin skriver godt nok den vil convatere dem når man ændre charset, så det kan være en gammel vertion der var problemer med


og så skal dine filer selvføgelig også være gemt som utf-8 uden BOM
alle led i kæden skal være sammen charset, ellers får du problemer.

hvis alle led i kæden har sammen charset burde man kunne undvære mysqli_set_charset, men jeg hr det altid på min connection
Avatar billede olsensweb.dk Ekspert
01. januar 2017 - 22:36 #5
>mysqli_real_escape_string har vist ikke noget med dit charset at gøre
men den bliver påvirket af charset'et
ref http://php.net/manual/en/mysqli.real-escape-string.php

The character set must be set either at the server level, or with the API function mysqli_set_charset() for it to affect mysqli_real_escape_string(). See the concepts section on character sets for more information.
Avatar billede compac Seniormester
02. januar 2017 - 12:56 #6
Det ser ud til at der er in fejl i selve formularen. Jeg bruger Notepad++ med "Inkodning utf-8 uden Bom".
Input felterne ser således ud:
<?php
include("connect-db.php");
function renderForm($first = '', $last ='', $error = '', $id = '')
{ ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>
<?php if ($id != '') { echo "Edit Record"; } else { echo "New Record"; } ?>
</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
<h1><?php if ($id != '') { echo "Edit Record"; } else { echo "New Record"; } ?></h1>
<?php if ($error != '') {
echo "<div style='padding:4px; border:1px solid red; color:red'>" . $error
. "</div>";
} ?>

<form action="" method="post">
<div>
<?php if ($id != '') { ?>
<input type="hidden" name="id" value="<?php echo $id; ?>" />
<p>ID: <?php echo $id; ?></p>
<?php } ?>

<strong>First Name: *</strong> <input type="text" name="firstname"
value="<?php echo $first; ?>"/><br/>
<strong>Last Name: *</strong> <input type="text" name="lastname"
value="<?php echo $last; ?>"/>

..osv

connect-db.php filen:
<?php
$server = 'localhost';
$user = 'root';
$pass = ' ';
$db = 'records2';

$mysqli = new mysqli($server, $user, $pass, $db);
mysqli_report(MYSQLI_REPORT_ERROR);

-hvis jeg bruger DBGp fejlsøgnings-værktøjet viser den at det forkerte tegnsæt allerede kommer i php-inputsætningerne, men stadigvæk vises det korrekt i formularen.
I php.ini-filen er definitionen: default_charset = "UTF-8"
Avatar billede compac Seniormester
02. januar 2017 - 13:02 #7
PS! Jeg har naturligvis forsøgt alle de muligheder jeg er blevet anbefalet først, men uden held
Avatar billede olsensweb.dk Ekspert
02. januar 2017 - 15:25 #8
jeg kan se ud fra guiden du linker til, du vil anvende Prepare Statement, hvis du er ny i dette så kig på
http://www.computerworld.dk/uploads/eksperten-guider/1480-Prepared-Statements-under-MySQLI-kom-igang.pdf

prøvede lige deres code
problemet ligger i htmlentities
http://php.net/manual/en/function.htmlentities.php


men er det nødvendigt med htmlentities ?? du anvender jo Prepare Statement

løsningen er

start med at sætte charset på din connection

$mysqli = new mysqli($server, $user, $pass, $db);
// mysqli_set_charset($mysqli, "utf8"); // procedural style
$mysqli->set_charset ( "utf8" ); // oop style

mysqli_report(MYSQLI_REPORT_ERROR);



i records.php (det er i NEW RECORD og i EDIT RECORD)
ret

$firstname = htmlentities($_POST['firstname'], ENT_QUOTES);
$lastname = htmlentities($_POST['lastname'], ENT_QUOTES);

til

$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
Avatar billede compac Seniormester
02. januar 2017 - 17:22 #9
Fantastisk god hjælp. Det virker.
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