Php 如何清理mysql列名中带有重音符号的字符

Php 如何清理mysql列名中带有重音符号的字符,php,mysql,Php,Mysql,我有一个字段,用户可以在其中设置mysql表中每一列的名称。我使用一个准备好的语句,这样SQL注入部分是安全的,但我有以下情况。我的语言(意大利语)充满了带a、è、ì、ò和ù的单词。它们是创建表时的有效字符 然后我有第二个表单,在这个新创建的表中插入数据。如果列名称中有一个带有重音字符,则会出现错误 所以我需要找到一种方法来清理用户输入,这样这些字符就可以被更安全的东西所取代。正确的方法是什么 实际上,我的代码是: <input type="text" class=&q

我有一个字段,用户可以在其中设置mysql表中每一列的名称。我使用一个准备好的语句,这样SQL注入部分是安全的,但我有以下情况。我的语言(意大利语)充满了带a、è、ì、ò和ù的单词。它们是创建表时的有效字符

然后我有第二个表单,在这个新创建的表中插入数据。如果列名称中有一个带有重音字符,则会出现错误

所以我需要找到一种方法来清理用户输入,这样这些字符就可以被更安全的东西所取代。正确的方法是什么

实际上,我的代码是:

<input type="text" class="form-control input-box" id="nome_field" name="nome_field" placeholder="nome del campo" maxlength="255">
//this is where the user fills in the name of the field
最后我插入数据

$stmt = $pdo->prepare("INSERT INTO campi (nome,...) VALUES (:nome,...)");
$stmt->bindParam(':nome', $nome_field);
$stmt->execute();

您可以使用preg_replace去掉所有非ascii字符

$str = preg_replace('/[[:^ascii:]]/', '', $str);
如果希望支持更多或更少的字符,则有许多字符集选项,例如:

  • 字母数字(A-Za-z0-9)
    alnum
  • 字母(A-Za-z)
    alpha

完整列表可用

您是否根据用户输入动态创建表?这是你通常不会做的事。为什么要通过应用程序动态创建表?因为我正在创建一个不同寻常的应用程序,它将完成通常无人能完成的任务。还有一些表几乎是通过用户输入创建的。:-)如果这些字符在命名表和/或列时有效,那么使用它们访问这些表和列应该不会有问题。请编辑您的问题,使其包含给出错误消息的源代码,包括您收到的实际错误消息,以及为了调试目的,您试图发送/准备的SQL查询。@Progman我的代码将根据用户表动态生成插入。关键是,字段名也将在准备好的语句中用作占位符。因此,如果字段名是
cittá
,则占位符将是
:cittá
,这将导致插入错误(这将导致索引数量与值不匹配的错误)。一般来说,这是占位符中的重音(我可以使用preg_replace),但我更愿意去掉它,因为在流程开始时,您可以使用带索引计数器的命名参数。它们不必匹配要插入的列。无论如何,您的查询都是高度动态的,因此您可以将它们命名为
:param1
:param20
(或任何当前大小)。是的,我考虑过这个选项,但我想清理它们,就像将它们替换为html实体一样,如è->
è但我不知道怎么做。这个代码将删除所有的信,我想避免它的声音像你正在寻找。只需注意
,因为如果处理不正确,将关闭SQL语句。这是解决问题的正确方法(将此应用于占位符),但最终我决定应用@progman建议的解决方法,将占位符更改为参数化的内容
$str = preg_replace('/[[:^ascii:]]/', '', $str);