相关疑难解决方法(0)

使用PHP从MySQL数据库中获取特殊字符

我有一张包含特殊字符的表格,例如™.

可以使用phpMyAdmin和其他软件输入和查看此字符,但是当我在PHP中使用SELECT语句输出到浏览器时,我会在其中获得带有问号的菱形.

表类型是MyISAM.编码是UTF-8 Unicode.整理是utf8_unicode_ci.

html头的第一行是

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Run Code Online (Sandbox Code Playgroud)

我在输出之前尝试在字符串上使用htmlentities()函数.没运气.

我也试过在任何输出之前将它添加到php(没有区别):

header('Content-type: text/html; charset=utf-8');
Run Code Online (Sandbox Code Playgroud)

最后我尝试在初始mysql连接下面添加这个(这导致显示其他奇数字符):

$db_charset = mysql_set_charset('utf8',$db);
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

php mysql utf-8 character-encoding

6
推荐指数
1
解决办法
4万
查看次数

使用 PHP 处理 GET 参数中的 unicode 值

我的服务器上有以下测试脚本:

<?php
echo "Test is: " . $_GET['test'];
?>
Run Code Online (Sandbox Code Playgroud)

如果我使用类似example.com/script.php?test=?(? 是多字节字符)的 url 调用它,则结果页面如下所示:

测试是:É¿

如果我尝试对 $_GET['test'] 中的值执行任何操作,例如将其保存为 mysql 数据库,我也会遇到同样的问题。我需要做什么才能让 PHP 正确处理这个值?

php unicode encoding utf-8

5
推荐指数
1
解决办法
4174
查看次数

字符集编码问题

我正在开发一个阿拉伯语网站.但是,我使用AJAX在我的数据库中保存了一些文本.AJAX和我一起工作得很好.我的问题是,当我将数据保存在我的数据库中并尝试在我的屏幕上打印时,它会返回一个奇怪的文本.我使用PHP函数mb_detect_encoding来确定数据库如何处理文本.该函数返回UTF-8.所以我使用iconv("windows-1256","UTF-8",$ row ["text"])在屏幕上打印文本,但它仍然返回这个奇怪的东西.请伸出手,谢谢

php mysql

5
推荐指数
2
解决办法
718
查看次数

Smarty:特殊字符变得不必要 - utf8

我有特殊字符的数据(法国口音严重).当我用php脚本和输出(打印)选择它看起来很好.当我传递给Smarty时,角色会被改变.我的html有以下设置:meta http-equiv ="content-type"content ="text/html; charset = utf-8"不确定缺少什么或不正确?

克里斯

php smarty utf-8

5
推荐指数
1
解决办法
8070
查看次数

SET NAMES命令失败,访问被拒绝

我试图在这个例子e之后插入一个重音到mysql数据库.使用这个:

mysql_query("SET NAMES 'utf8'");
Run Code Online (Sandbox Code Playgroud)

抛出:

警告:mysql_query()[function.mysql-query]:拒绝访问用户'ODBC'@'localhost'

它没有连接到数据库:

DEFINE ('DB_USER', 'user');
DEFINE ('DB_PASSWORD', 'pword');
DEFINE ('DB_HOST', 'localhost');
DEFINE ('DB_NAME', 'test1');
$dbc = @mysqli_connect (DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
Run Code Online (Sandbox Code Playgroud)

php mysql unicode utf-8

5
推荐指数
2
解决办法
3万
查看次数

上传具有阿拉伯名称的文件

我正在尝试上传具有阿拉伯名称的文件(مرحبابكم),但是当我将其上传到服务器时,字符串不正确,它会显示这样的字符(ريÙ-Ù).

那么,我如何上传文件并保留正确的阿拉伯名字?

<form action="up.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
Run Code Online (Sandbox Code Playgroud)

PHP文件:

 <?php
if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["file"]["error"] . "<br>";
  }
else
  {
  echo "Upload: " . $_FILES["file"]["name"] . "<br>";
  echo "Type: " . $_FILES["file"]["type"] . "<br>";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
  echo "Stored in: " . $_FILES["file"]["tmp_name"];
  }
?>
Run Code Online (Sandbox Code Playgroud)

php upload arabic

5
推荐指数
1
解决办法
3262
查看次数

如何处理数据库中的重音和奇怪的字符?

我试图用我的数据库中的重音安全西班牙语单词,但它不会工作,我已经尝试过:

1)将表和行的连接更改为utf8_spanish_ciutf_unicode_ci.

2)添加标头标签

<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
Run Code Online (Sandbox Code Playgroud)

3)加入

header("Content-Type: text/html;charset=utf-8");
Run Code Online (Sandbox Code Playgroud)

在一个PHP标签.

在我的笔记本电脑的xampp服务器中执行此操作将工作,但当我将数据库上传到登录怪物服务器时,它不会正确保存重音.

编辑:这是我正在使用的连接:

    private function Connect()
    {
        //$this->settings = parse_ini_file("settings.ini.php");
        try 
        {
            # Read settings from INI file, set UTF8
            $this->pdo = new PDO('mysql:host=localhost;dbname=xxxxx;charset=utf8', 'xxxxx', 'xxxxxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

            # We can now log any exceptions on Fatal error. 
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            # Disable emulation of prepared statements, use REAL prepared statements instead.
            $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

            # Connection succeeded, set the boolean to true.
            $this->bConnected = …
Run Code Online (Sandbox Code Playgroud)

php mysql database utf-8

5
推荐指数
1
解决办法
2553
查看次数

来自 MS SQL Server 通过 Linux 上的 PHP 的非模拟准备语句支持

概括

我正在尝试使用准备好的语句来停止 SQL 注入,但我无法找到保证它正常工作所需的支持。


设想

我在 Linux 上托管一个站点,该站点连接到带有 FreeTDS 0.91 版的 Microsoft SQL Server,特别是使用 FreeTDS 的dblib. 我已将tds数据库连接的版本设置为 7.4,并且正在使用 PHP 的PDO对象。

根据FreeTDS 文档,4.2 不支持准备好的语句:

TDS 4.2 有限制

  • 当然,只有ASCII。
  • 不支持 RPC。
  • 不支持 BCP。
  • varchar 字段限制为 255 个字符。如果您的表定义了更长的字段,它们将被截断。
  • 不支持动态查询(也称为准备语句)。

然而,没有任何迹象表明 7.4 不支持准备好的语句,这给了我合理的信心,它们至少不会引发驱动程序错误。

PHP 的 PDO 支持通过PDO::setAttribute(). 我有兴趣PDO::ATTR_ERRMODE将所有错误设置为异常,并PDO::ATTR_EMULATE_PREPARES在兼容时强制数据库执行准备好的语句。


问题

测试连接时,我收到以下错误:

数据库错误:SQLSTATE[IM001]:驱动程序不支持此功能:驱动程序不支持设置属性

无法设置PDO::ATTR_EMULATE_PREPARES,我无法保证数据库实际上按预期执行准备好的语句。

无论如何要修改我的方法,或者是否有替代方法来保证准备好的语句在来自 Linux 的 MS SQL Server 上安全地执行?

php linux sql-server pdo freetds

5
推荐指数
1
解决办法
769
查看次数

PHP如何确定浏览器POST请求数据中的字符编码?

当浏览器在 POST 请求正文中发送数据(即name=value来自表单元素的对)时,PHP 如何确定字符编码,以便它可以正确地将位流解码为字符以供其内部使用?
我可以理解,对于某些 PHP 不需要解码的任务,例如对于 SQL INSERT 查询,它可能只是将数据/字符串传递到 DBMS,而不进行额外的处理。
但对于文本处理/正则表达式操作,我想 PHP 需要将位流解码为字符,然后才能对它们执行测试、模式匹配等。
另外,似乎因为编码是由浏览器决定的,所以 PHP 需要浏览器的指导来确定它使用什么字符集来编码 POST 数据。
预计该指导将出现在请求标头中,我设置了一个文本表单

<meta charset="utf-8">
Run Code Online (Sandbox Code Playgroud)

在包含表单的网页的头部,输入一些值并提交表单后,请求标头不包含有关如何编码 POST 数据的明显信息

POST /experiments/foo.php HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 57
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://localhost/experiments/how_does_php_encode_data_it_receives_from_browser.php
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Run Code Online (Sandbox Code Playgroud)

还是还有其他事情发生?例如,浏览器是否需要按照某种预先确定的标准对字符进行编码?
PHP 如何知道如何解码从浏览器 POST 请求接收到的数据?

php encoding

5
推荐指数
1
解决办法
2885
查看次数

PHP 读取 UTF-8 CSV

我有一个从 CSV 文件读取的 PHP 脚本,该文件采用 UTF-8 格式,下面的代码将其视为 ASCII。如何更改代码以将文件读取为 UTF-8?

if (($handle = fopen("books.csv", "r")) === FALSE)
  throw new Exception("Couldn't open books.csv");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
Run Code Online (Sandbox Code Playgroud)

[编辑] 我当前代码的一个问题是,第一行的第一个值始终包含三个字节,用于标识开头附加的 UTF-8 文件。所以我猜一个按值或按行操作的解决方案可能不够好?

php csv utf-8 drush drupal-8

5
推荐指数
1
解决办法
6736
查看次数