Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用非英语字符更新MySQL表无效,排序规则和字符集都设置为utf8或utf8mb4_Php_Mysql_Encoding_Utf 8 - Fatal编程技术网

Php 使用非英语字符更新MySQL表无效,排序规则和字符集都设置为utf8或utf8mb4

Php 使用非英语字符更新MySQL表无效,排序规则和字符集都设置为utf8或utf8mb4,php,mysql,encoding,utf-8,Php,Mysql,Encoding,Utf 8,我在尝试更新数据库时遇到问题,我认为与字符集/排序问题有关。我搜索了所有其他相关问题,更新了排序规则和字符集,尝试了所有方法,但似乎没有任何效果 我正在做的是从抓取一些HTML(获得网站所有者的许可)中获取数据,对其进行一点操作,然后执行更新将操作后的数据保存在我的表中 我有一个字段,reference,它取自HTML,更新会查找该字段,如果该字段匹配,就会更新我的表。如果没有特殊(非英语)字符,它可以正常工作: UPDATE database.table SET points=100,其中re

我在尝试更新数据库时遇到问题,我认为与字符集/排序问题有关。我搜索了所有其他相关问题,更新了排序规则和字符集,尝试了所有方法,但似乎没有任何效果

我正在做的是从抓取一些HTML(获得网站所有者的许可)中获取数据,对其进行一点操作,然后执行
更新
将操作后的数据保存在我的表中

我有一个字段,
reference
,它取自HTML,更新会查找该字段,如果该字段匹配,就会更新我的表。如果没有特殊(非英语)字符,它可以正常工作:

UPDATE database.table SET points=100,其中reference='Real Madrid'

如果
参考中有任何非英语字符
,那么如果我从我的PHP/HTML站点进行更新,则更新不起作用-如果我将下面的查询直接放入
phpmyadmin
,则可以正常工作:

UPDATE database.table SET points=100,其中reference='Atlético Madrid'

这发生在我尝试过的每一个非英语字符上,而不仅仅是
é
,所以这似乎是根本问题

我摄取的HTML最初是
UTF-8
,但在某些时候,我的文本编码似乎正在从直接
UTF-8
更改为
ASCII
ASCII
不是
UTF-8
的子集吗?不完全确定这是否是问题所在,但编码不同,这很奇怪

下面是我的代码,在不同的时间指出了编码:

$html = file_get_html('http://url.to.scrape');

// At this point, `mb_detect_encoding($html)` is UTF-8.

    $i = 1;

    while($i <= 20){
    foreach($html->find('tr') as $tableRow) {
      // At this point, `mb_detect_encoding($tableRow) is `ASCII`
      $rowData['team'] = $tableRow->find('td', 0)->plaintext;
      // At this point, `mb_detect_encoding($rowData['team']) is `ASCII`
      $rowData['points'] = $tableRow->find('td', 1)->plaintext;

      $points = $rowData['points'] * doSomeManipulationHere();

      $update_query = "UPDATE database.table SET points = $points WHERE reference = '". $rowData['team'] ."'";
      print_r($update_query);
    }
  }
$html=file\u get\u html('http://url.to.scrape');
//此时,`mb_detect_encoding($html)`是UTF-8。
$i=1;
而($i find('tr')为$tableRow){
//此时,`mb_detect_encoding($tableRow)是`ASCII`
$rowData['team']=$tableRow->find('td',0)->明文;
//此时,`mb_detect_encoding($rowData['team'])是`ASCII`
$rowData['points']=$tableRow->find('td',1)->纯文本;
$points=$rowData['points']*dosomeoperationhere();
$update_query=“update database.table SET points=$points WHERE reference='””$rowData['team']。“”;
打印(更新查询);
}
}
如前所述,如果
$rowData['team']
不包含非英语字符,则它可以工作。如果它确实包含任何内容,则不包含任何内容

同样,如前所述,如果我
print\r($update\u query)
,并将输出直接复制/粘贴到
SQL
选项卡中的
phpmyadmin
,它会按预期工作,即使带有字符,因此我相信MySQL字符集/排序规则设置正确,这是PHP/HTML/MySQL连接中的某个地方导致的问题

我想我需要弄清楚为什么我的数据在开始时是
UTF-8
的时候突然变成了
ASCII

我的设置:
MySQL服务器连接排序规则:
utf8mb4\u unicode\u ci

MySQL表排序规则:
utf8mb4\u unicode\u ci

MySQL字段排序规则:
utf8mb4\u unicode\u ci

PHP默认字符集:
UTF-8

HTML:
.htaccess
/
charset.conf
AddDefaultCharset UTF-8
(编辑:在最初发布后添加,感谢@asiri的建议)

我尝试发送
标题('Content-Type:text/html;charset=utf-8'),这没有帮助


我还看到了可怕的黑色问号
当我在网站上查看这些字符时,一定是某个地方的编码,我只是不知道在哪里。

您可以尝试在.htaccess文件中设置编码

AddDefaultCharset utf-8
将此行添加到放置代码的根目录中的.htaccess文件中

试试这个。下面的代码将在数据库连接中设置编码

$link = mysqli_connect('localhost', 'user', 'password', 'database');
mysql_set_charset('utf8',$link); 

我在最初的帖子中没有提到这一点,但我已经在
.htaccess
中提到了,而不是在我的
apache2/conf enabled/charset.conf
config中。我在个人
.htaccess
中也尝试过它,但没有成功,我想我应该把它放在服务器上看看是否有效。我的下一个建议是在数据库连接中设置字符集。我将相应地编辑答案。谢谢Asiri,不幸的是这也不起作用。我觉得我已经在
UTF-8
问题线程中尝试了每一个建议,但似乎没有任何效果。看起来一切都是UTF-8,除了在PHP代码中执行实际查询的时间。