Javascript php pdo字符集utf8 mysql:找不到强调字段

Javascript php pdo字符集utf8 mysql:找不到强调字段,javascript,php,database,character-encoding,Javascript,Php,Database,Character Encoding,我有一张“家庭”桌 CREATE TABLE famille ( idf INTEGER(6) NOT NULL , >>>>>> nomf VARCHAR(40) NOT NULL, CONSTRAINT pk_famille PRIMARY KEY (idf), >>>>>> CONSTRAINT un_famille_nomf >>

我有一张“家庭”桌

    CREATE TABLE famille (
      idf INTEGER(6) NOT NULL ,  
>>>>>>      nomf VARCHAR(40) NOT NULL, 
      CONSTRAINT pk_famille 
        PRIMARY KEY (idf),
>>>>>>      CONSTRAINT un_famille_nomf 
>>>>>>      UNIQUE (nomf)
    )ENGINE = InnoDB, DEFAULT CHARACTER SET utf8; <<<<<<<<<
我使用异步查询Javascript/Php检查表单中的值,该表单允许添加一个新的“famile”,并且表单中字段“fnom”的值已经存在于表中:当le输入字段没有加重音时,它可以工作,但当有加重音的字符时,它不工作:表单是submit,我得到一个正常的SQL错误

简化表格:

<html><head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta charset="utf-8" />   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<title>Gestion - Administration du site</title>
...
<link rel='stylesheet' href='main.css' type='Text/css'>
<script src="js/checkfamille.js?dev=1574345195"></script>
</head>
<body><h2 class='entete'>Les familles</h2>
...
<form name='frmNewfamille' id='frmNewfamille'  method='post' ><fieldset id='fs1'><legend><b>Informations</b></legend><div class='ligne'><span class='label'><label for='fidf'>Identifiant</label></span><span class='champs'>
<input type='number' size='6' minlength='6' maxlength='6' name='fidf' id='fidf' required value='' /></span>
</div><div class='ligne'><span class='label'><label for='fnomf'>Intitulé</label></span><span class='champs'>
<input type='text' size='40' minlength='40' maxlength='40' name='fnomf' id='fnomf' required value='' /></span></div></fieldset><fieldset>
<input type="hidden" id="valide" name="valide" hidden />

<input class='bouton' type='button' name='btnNewAfamille'  id='btnNewAfamille' value='Ajouter'
onclick='return checkfamille();' />
>>>>>>>>>>>>>>>>>>>^^^^^^^^^^^

</fieldset>

</form>
...
下面是查询错误:

    Erreur SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate 
    entry 'Rosacées' for key 'un_famille_nomf'
我查过了 -所有源文件:utf8 OK -数据库数据 -php/mysql连接参数和代码:

define("DB_HOST", "localhost");  
define("DB_USER", "xxxx");  
define("DB_PASS", "xxxx");  
define("DB_NAME", "xxxx");
define("DB_CHARSET", "utf8"); 
和一个数据库类:

class Database
{
private $host = DB_HOST;  
private $user = DB_USER;  
private $pass = DB_PASS;  
private $dbname = DB_NAME;
private $charset = DB_CHARSET;

private $dbh;  
private $error;

private $stmt;  

public function __construct(){   
    $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname. ';charset=' .  $this->charset;
    // Options  
    $options = array(  
    PDO::ATTR_PERSISTENT => true,  
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"  
    );  

    try{  
    $this->dbh = new PDO($dsn, $this->user, $this->pass, $options); 
    $this->dbh->exec("SET NAMES utf8;");    
    }   
    catch(PDOException $e){  
    $this->error = $e->getMessage();  
    }  
}
...

我会错过什么吗

谢谢你的帮助

****编辑**** 写了这条消息之后,我想知道它是否来自PHP异步PHP代码调用中的escape(nomf.value)。。。我删除了“逃逸”这个词,它就行了

return checkFamilleAjax('code.php?idf='+idf.value
+'&nomf='+nomf.value
+'&mode=insert'); 
Javascript“转义”将字符(例如accuentuated)更改为十六进制值:(从*更改*从法语参考更改为英语参考)


此函数已过时,必要时应使用“encodeURI”和“encodeURIComponent”。

检查是否所有文件(JS/HTML)都已编码/保存为UTF-8。也许只有一个不是,并且导致了编码问题。还要检查UTF-8是否嵌入了(BOM)字节顺序标记。是的,我已检查了所有文件。问题来自于使用“encode”Javascript函数将重音字符转换为十六进制。我把它拿走了,一切都好。您可以在文章的编辑部分看到。谢谢。我怎样才能把这篇文章标记为已解决?谢谢你,如果管理员可以这样做,并删除此评论。嗯…,如何将其标记为已解决。我知道你说过你删除了有问题的函数调用,但从某种程度上说,这并不能完全解决问题。我会让你决定怎么做。我很高兴你能继续。
    Erreur SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate 
    entry 'Rosacées' for key 'un_famille_nomf'
define("DB_HOST", "localhost");  
define("DB_USER", "xxxx");  
define("DB_PASS", "xxxx");  
define("DB_NAME", "xxxx");
define("DB_CHARSET", "utf8"); 
class Database
{
private $host = DB_HOST;  
private $user = DB_USER;  
private $pass = DB_PASS;  
private $dbname = DB_NAME;
private $charset = DB_CHARSET;

private $dbh;  
private $error;

private $stmt;  

public function __construct(){   
    $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname. ';charset=' .  $this->charset;
    // Options  
    $options = array(  
    PDO::ATTR_PERSISTENT => true,  
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"  
    );  

    try{  
    $this->dbh = new PDO($dsn, $this->user, $this->pass, $options); 
    $this->dbh->exec("SET NAMES utf8;");    
    }   
    catch(PDOException $e){  
    $this->error = $e->getMessage();  
    }  
}
...

return checkFamilleAjax('code.php?idf='+idf.value
+'&nomf='+nomf.value
+'&mode=insert'); 
escape("abc123");     // "abc123"
escape("äöü");        // "%E4%F6%FC"
escape("ć");          // "%u0107"