Расширенные символы ascii в mySql с подготовленными выражениями
Вставляя (или обновляя) запись в mysql, используя подготовленные операторы и привязку значений, я столкнулся с проблемой, пытаясь вставить слово child’s
который содержит расширенный символ 145 ascii (правая одинарная кавычка). Все данные после "d" усекаются. Это верно для вставки любого из нечетных символов MS Word. Моя таблица закодирована как utf8_general_ci, и я все время в своем коде использую utf-8. Поле имеет тип "текст".
Конечно, я могу избежать их или сделать str_replace()
удалить их (это то, что я хочу сделать), но я хотел бы понять, почему я не могу вставить их напрямую, так как я всегда думал, что подготовленные заявления обрабатывают это.
Пример кода вставки - неполный, но он показывает основные
$q = "INSERT INTO mytable (userid, title, descr) VALUES (?,?,?)";
if (!($stmt = $this->mysqli->prepare($q))) {
error_log("You have a problem...");
return false;
}
/* bind parameters for markers */
$stmt->bind_param("iss", $userid, $title, $descr);
/* execute query */
$stmt->execute();
if ($stmt->errno) {
$e = new Exception;
error_log("\r\nSql Error: " . $q . ' Sql error #: ' . $stmt->errno . ' - ' . $stmt->error . "\r\n" . $e->getTraceAsString());
return false;
} else {
$lastinsertedid = $this->mysqli->insert_id;
/* close statement */
$stmt->close();
return $lastinsertedid;
}
2 ответа
Кодировка для ’
не было utf8. Это единственная проблема. Ваш код может быть utf8 повсюду, но данных не было.
Дело в том, что child’s
усеченный после d
является признаком того, что байты non-utf8 передаются в хороший код.
Узнайте, какое приложение или код генерирует ’
либо выясните, какую кодировку он генерирует, либо выясните, можно ли это сделать для генерации utf8. В первом случае нам нужно изменить одну настройку, в другом случае изменение кода не требуется.
HEX('’')
является E282AC
в utf8.
Это не должно быть проблемой, привязка параметра как строки должна экранировать любые кавычки по мере необходимости.
Попробуйте, чтобы увидеть, если вы видите, в чем ошибка.
$stmt = $this->mysqli->prepare($q);
if (!is_object($stmt))
error_log("You have a problem...");
var_dump($this->mysqli);
}
PS Не забудь $stmt->close()
после $stmt->execute()
как вы столкнетесь с проблемами синхронизации при попытке нескольких подготовленных операторов
Я также могу предложить несколько советов по очистке синтаксиса, ответьте на ваш обновленный вопрос:
$q = "INSERT INTO mytable (userid, title, descr) VALUES (?,?,?)";
$stmt = $this->mysql->prepare($q);
if (!is_object($stmt))
error_log("You have a problem...");
var_dump($this->mysqli);
}
/* bind parameters for markers */
$stmt->bind_param("iss", $userid, $title, $descr);
/* execute query */
$stmt->execute();
if ($stmt->errno) {
$stmt->close(); // Still need to close here
$e = new Exception;
error_log("\r\nSql Error: " . $q . ' Sql error #: ' . $stmt->errno . ' - ' . $stmt->error . "\r\n" . $e->getTraceAsString());
return false;
}
/* close statement */
$stmt->close();
return $this->mysqli->insert_id;