html-кодирование вывода && неверная ошибка строки - PullRequest
0 голосов
/ 08 апреля 2010

мои данные включают арабские символы, которые выглядят как мусор в mysql, но отображаются правильно при запуске в браузере.мои вопросы:

  • как мне html-кодировать вывод?
  • если я добавлю это ко всем своим файлам: <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> я получу эту ошибку: Error: Incorrect string value: '\xE4\xEE\xC3\xD8\xEF\xE6...' for column 'cQuotes' at row 1

Я работаю на платформе php / mysql.

Форма вставки в html:

<!doctype html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Your Favorite Quotes</title>
<link rel="stylesheet" type="text/css" href="style.css" /> 
<link rel="stylesheet" href="css/validationEngine.jquery.css" type="text/css" media="screen" charset="utf-8" />
<script type="text/javascript" src="scripts/jquery-1.4.2.js"></script>
<script src="scripts/jquery.validationEngine-en.js" type="text/javascript"></script> 
<script src="scripts/jquery.validationEngine.js" type="text/javascript"></script>
<script type="text/javascript">
            $(document).ready(function() { 
                $("#submitForm").validationEngine() 
            })  
</script>
</head>
<body>

<div class="container">
<div class="center_div">
<h2>Submit Your Quote</h2>
<fieldset>
<form id="submitForm" action="qinsert.php" method="post">
<div class="field">
<label>Author: </label>
<input id="author" name="author" type="text" class="validate[required,custom[onlyLetter],length[0,100]]">
</div><br />
<div class="field">
<label>Quote: </label>
<textarea id="quote" name="quote" class="validate[required, length[0,1000]]"></textarea>
<br />
</div>
<input id="button1" type="submit" value="Submit" class="submit" /><br />
<input id="button2" type="reset" value="Reset" /> 
</form>
</fieldset>
</div>
</div>


</body>
</html>

//////////////////////

запрос в php:

//<?php
//header('Content-Type: text/html; charset=UTF-8');
//?>
<!doctype html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="style2.css" /> 
<title>Your Quote Databank</title>
</head>
<body>

<?php
include 'config.php';

echo "Connected <br />";


//check for quotes and apostrophes

$author = '';
$quote = '';

$author = $_POST['author'];
$quote = $_POST['quote'];

$author = mysql_real_escape_string(trim($author)); 
$quote = mysql_real_escape_string(trim($quote)); 


//**************************


//validating data

$query = "SELECT * FROM Quotes where cQuotes = '$quote' limit 1;";

$result = mysql_query($query, $conn);

//now check that the number of rows is 0

if (mysql_num_rows($result) > 0 ) {
header("Location: /error.html");
exit;
}



//inserting data
//mysql_query("SET NAMES 'utf8'");
//mysql_query("SET CHARACTER SET utf8");
$sql="INSERT INTO Quotes (vauthor, cquotes)
VALUES ('$author', '$quote')";

if (!mysql_query($sql,$conn))
  {
  die('Error: ' . mysql_error());
  }
echo "<div class='container'><p><label class='lbl_record'> Record Added Successfully!</label>";
echo "<a href='qform.html'> Submit a New Quote!</a></p>";

//**************************


//selecting data
$result = mysql_query("SELECT * FROM Quotes ORDER BY idQuotes DESC");

echo "<div class='center_div'>";
echo "<table>
<thead>
<tr>
<th>Author</th>
<th>Quotes</th>
</tr>
</thead>";

while($row = mysql_fetch_array($result))
  {
  echo "<tbody><tr>";
  echo "<td width='150px'>" . $row['vAuthor'] . "</td>";
  echo "<td>" . $row['cQuotes'] . "</td>";
  echo "</tr>";
  }
echo "</tbody></table>";
echo "</div></div>";
//**************************

include 'close_config.php';

?>

</body>
</html>

Ответы [ 5 ]

2 голосов
/ 08 апреля 2010
Incorrect string value: '\xE4\xEE\xC3\xD8\xEF\xE6...'

Это похоже на арабскую строку, закодированную в ISO-8859-6.Вы получите эту ошибку, если вы получили строку байтов ISO-8859-6 и пытаетесь вставить ее в таблицу базы данных UTF-8.

Ваш сценарий не должен был получить ISO-8859-6 отбраузер, если ваша страница формы правильно помечена как UTF-8, как подразумевается meta.Проверьте в браузере, что при отображении формы в меню «Вид-> Кодировка» установлен флажок «UTF-8».<meta> может быть переопределено веб-сервером, передающим реальный заголовок Content-Type: text/html;charset=....

Это также может произойти, если ваш PHP пытается использовать неправильную кодировку для связи с сервером.Я вижу, что вы закомментировали SET NAMES ... Я бы использовал mysql_set_charset('utf8'); в предпочтении.

echo "<td>" . $row['cQuotes'] . "</td>";

Вам необходимо кодировать HTML-код для выводаздесь, но не из-за проблем с кодировкой.Любые символы < и & требуют кодирования в тексте, в противном случае они могут внедрить нежелательную разметку HTML, включая JavaScript, в этом случае у вас возникают проблемы с межсайтовым скриптингом.

echo '<td>'.htmlspecialchars($row['cQuotes']).'</td>';

В сторону: ..Однако PHP - это язык шаблонов.Используйте его, не боритесь с ним, пытаясь самостоятельно создавать шаблоны строк.

<table>
    <?php while ($row= mysql_fetch_array($result)) { ?>
        <tr>
            <td width="150"><?php h($row['vAuthor']) ?></td>
            <td><?php h($row['cQuotes']) ?></td>
        </tr>
    <?php } ?>
</table>

(width="150px" не работает, px только для CSS.) Выше предполагается, что вспомогательная функция похожа наэто, чтобы вам не пришлось набирать htmlspecialchars так много:

function h($s) {
    echo htmlspecialchars($s, ENT_QUOTES);
}
2 голосов
/ 08 апреля 2010

нет такого понятия "персонажи". есть только кодировка . Вы должны определить кодировку, которую вы используете. И затем установите эту кодировку для всех трех частей вашего приложения:

  • HTML-страница
  • PHP скрипт
  • база

UTF-8 настоятельно рекомендуется.
Чтобы использовать его, вы должны установить кодировку вашей базы данных, создав таблицы с default charset=utf8, клиентскую кодировку mysql, выполнив запрос SET NAMES utf8 в своем клиентском приложении и установив header("Content-Type: text/html; charset=utf-8"); для страницы, содержащей форму html и для страница с результатами

Согласно вашему изданию:
Добавьте эту строку в ваш файл config.php:

mysql_query("SET NAMES utf8");

А также проверьте кодировку таблиц mysql. Вы можете сделать это с помощью show create table Quotes query

0 голосов
/ 07 марта 2011

пока вы используете проверку jquery, вы можете попробовать это для арабского

"onlyLetterSp": {
    "regex": /^[a-zA-Z\u0600-\u06FF\ \']+$/,
    "alertText": "* أحرف فقط"
},
0 голосов
/ 08 апреля 2010

Попробуйте:

while($row = mysql_fetch_array($result))
{
  echo "<tbody><tr>";
  echo "<td width='150px'>" . htmlentities($row['vAuthor']) . "</td>";
  echo "<td>" . htmlentities($row['cQuotes']) . "</td>";
  echo "</tr>";
}

для получения более подробной информации см. htmlentities функция ref

0 голосов
/ 08 апреля 2010

Вам не нужно использовать HTML-объекты.Вам необходимо выбрать кодировку символов, подходящую для арабских символов (например, UTF-8), и использовать все промежуточные инструменты, чтобы использовать ее правильно: MySQL, mysql_query (), PHP, HTML ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...