мои данные включают арабские символы, которые выглядят как мусор в mysql, но отображаются корректно при запуске в браузере. мои вопросы:
<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>
Incorrect string value: '\xE4\xEE\xC3\xD8\xEF\xE6...'
Это похоже на арабскую строку, закодированную в ISO-8859-6. Вы получите эту ошибку, если вы получили строку байта ISO-8859-6 и пытаетесь вставить ее в таблицу базы данных UTF-8.
Ваш скрипт не должен был получать ISO-8859-6 из браузера, если ваша страница формы правильно помечена как UTF-8, как это предполагает meta
. Проверьте в браузере, что при отображении формы в меню View-> Encoding отображается «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); }
нет таких вещей «персонажей». есть только кодировка . Вы должны определить кодировку, которую используете. И затем установите эту кодировку для всех трех частей приложения:
Рекомендуется использовать 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
Вам не нужно использовать объекты HTML. Вам нужно выбрать кодировку символов, подходящую для арабских символов (например, UTF-8), и использовать все промежуточные инструменты для ее использования: MySQL, mysql_query (), PHP, HTML …
Попробуй это:
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
в то время как вы используете проверку jquery, вы можете попробовать это для арабского языка
"onlyLetterSp": { "regex": /^[a-zA-Z\u0600-\u06FF\ \']+$/, "alertText": "* أحرف فقط" },