Я прочитал много постов, касающихся проблемы similair с проблемами utf-8, и пробовал некоторые тоже, но не могу найти причину.
Я использую livecode и хочу зашифровать некоторые строки в базе данных. Поэтому я шифрую в Livecode, затем base64encode, а затем отправляю в базу данных через PHP / PDO.
шифрование -> base64encode -> base64decode -> дешифрование в реальном коде работает нормально.
Теперь, когда я отправляю закодированные в base64 данные в базу данных MariaDB, он сохраняет их, за исключением того, что + стал пробелом.
База данных, таблица и столбцы — все это utf8mb4_unicode_ci.
Если я поменяю пробел на + вручную через phpmyadmin в базе данных и прочитал с Livecode, то он base64decodes -> расшифровывает правильно!
Это файлы php, которые я использую для подключения и обновления БД:
<?php
// the connect.php file
$servername = "localhost";
$username = "blabla";
$password = "blabla";
try {
//$db = new PDO("mysql:host=$servername;dbname=blabla",$username, $password);
$db = new PDO("mysql:host=$servername;dbname=blabla;charset=utf8", $username, $password);
//$db = new PDO("mysql:host=$servername;dbname=blabla;charset=utf8mb4", $username, $password,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'"));
// set the PDO error mode to exception
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>
Вы можете видеть, что я попробовал несколько кодировок в файле подключения также
<?php
//this is the file to update the DB
require_once 'connect.php';
//
try {
$stmt = $db->prepare("UPDATE tabel_users SET user=:user,
password=:password, email=:email, userlevel=:userlevel WHERE
id_user=:id_user");
$stmt->bindParam(':id_user', $_POST['id_user'], PDO::PARAM_INT);
$stmt->bindParam(':user', $_POST['user'], PDO::PARAM_STR);
$stmt->bindParam(':password', $_POST['password'], PDO::PARAM_STR);
$stmt->bindParam(':email', $_POST['email'], PDO::PARAM_STR);
$stmt->bindParam(':userlevel', $_POST['userlevel'], PDO::PARAM_STR);
//$stmt->bindParam(':user', $_POST['user'], PDO::PARAM_LOB);
//$stmt->bindParam(':password', $_POST['password'], PDO::PARAM_LOB);
//$stmt->bindParam(':email', $_POST['email'], PDO::PARAM_LOB);
//$stmt->bindParam(':userlevel', $_POST['userlevel'], PDO::PARAM_LOB);
$affected_rows = $stmt->rowCount();
if($stmt->execute()) { echo "Ge-update informatie verzonden naar de
database!"; } else { echo "Failure!"; };
}
catch(PDOException $e)
{
echo "Not updated: " . $e->getMessage();
}
//var_dump($_POST)
$db = NULL;
?>
Также попробовал PDO :: PARAM_LOB
Пробовал VARCHAR VARBIN BLOB, но это ничего не изменило.
Моим первым предположением было то, что Livecode делает что-то странное при публикации в php-файл. Но проверка переменной непосредственно перед отправкой имеет + в строке для отправки. Так что я не понимаю, где все идет не так.
Ваша проблема не с базой данных, а в том, что php является url, декодирующим вашу строку base64, которая преобразует ‘+’ в » (плюс в пробел). Вам необходимо urlencode вашего параметра пароля, прежде чем публиковать его. Вот документ LiveCode для URLEncode.
Это зависит от типа содержания вашего сообщения, как описано более подробно Вот.
У меня была та же проблема, но переход с PHP на livecode, и я пришел к выводу, что проблема была в шифровании php против шифрования livecode. если вы попробуете базовое кодирование без шифрования, они будут играть хорошо. У меня нет ответа, но я помню, как эксперты говорили, что это связано с «заголовком» зашифрованного двоичного файла. в идеале я хотел бы увидеть ответ на эту проблему, так как я обошелся без шифрования.
Когда я использую кодировку base64 для обмена данными с другой системой (JavaScript), я всегда использую этот код после кодирования:
Замените пробел пустым в tEncodedData.
LC добавляет пробелы для base64encode. Работает нормально, когда я их удаляю.