У меня есть переменная $tekst
это строка Я хочу сохранить эту переменную в базе данных mssql. Я использую MSSQL libary. Все работало нормально, пока у меня не было строки со специальными символами, такими как ë é ä á
тогда это сохранит это так ë é ä á
Это код, который я использовал:
$tekst = htmlspecialchars($_POST['tekst']);
$mssql = new Mssql();
$mssql->connect();
$mssql->query("UPDATE siteteksten
SET Siteteksten_Nl='$tekst'
WHERE Sitetekst_Id=$id");
header('Location:'.$_SERVER['HTTP_REFERER']);exit();
Тип данных столбца Siteteksten_Nl
является nvarchar
а также Вот Я узнал, что nvarchar имеет UCS-2
кодировка, поэтому я добавил
$tekst = mb_convert_encoding( $tekst, 'UCS-2', mb_detect_encoding($tekst, mb_detect_order(), true) );
Но теперь данные даже без специальных символов, таких как ë é ä á
запрос не будет выполнен. Возвращает это сообщение об ошибке:
Array ( [0] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 105 [code] => 105 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Unclosed quotation mark after the character string ''. [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Unclosed quotation mark after the character string ''. ) [1] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 102 [code] => 102 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Incorrect syntax near ''. [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Incorrect syntax near ''. ) )
Может кто-нибудь увидеть, что мне здесь не хватает?
Это класс Mssql
class Mssql {
private $username = 'username';
private $password = 'password';
private $db = 'database';
private $server = 'server';
private $conn;
public function connect() {
ini_set('mssql.charset', 'UTF-8');
$this->conn = mssql_connect($this->server, $this->username, $this->password);
mssql_select_db($this->db);
if (!$this->conn) {
die("Connection could not be established.<br> Linux <br>");
}
}
public function query($sql, $return_message=true) {
$query = mssql_query($sql, $this->conn);
// Did the query fail?
if (!$query && $return_message=true) {
return mssql_get_last_message();
}
// Fetch the row
if (!mssql_num_rows($query)) {
return 'No records found';
} else {
$rows = [];
while ($row = mssql_fetch_array($query, MSSQL_BOTH)) {
array_push($rows, $this->encode_items($row) );
}
return $rows;
}
}
public function num_rows($sql) {
$query = mssql_query($sql);
// Did the query fail?
if (!$query) {
die('MSSQL error: ' . mssql_get_last_message());
}
return mssql_num_rows($query);
}
public function encode_items($array) {
foreach($array as $key => $value) {
if(is_array($value)) {
$array[$key] = encode_items($value);
}
else {
$array[$key] = mb_convert_encoding($value, "UTF-8", "ASCII");
}
}
return $array;
}
}
ОБНОВИТЬ:
Я нашел решение. Сначала я позвонил utf8_decode
функция на $tekst
переменная, чем я поставил N перед строкой в запросе.
$tekst = utf8_decode($tekst);
$mssql->query("UPDATE siteteksten SET $taal=N'$tekst' WHERE Sitetekst_Id=$id");
Задача ещё не решена.
Других решений пока нет …