我有一张包含特殊字符的表格,例如™.
可以使用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
echo "Test is: " . $_GET['test'];
?>
Run Code Online (Sandbox Code Playgroud)
如果我使用类似example.com/script.php?test=?(? 是多字节字符)的 url 调用它,则结果页面如下所示:
测试是:É¿
如果我尝试对 $_GET['test'] 中的值执行任何操作,例如将其保存为 mysql 数据库,我也会遇到同样的问题。我需要做什么才能让 PHP 正确处理这个值?
我正在开发一个阿拉伯语网站.但是,我使用AJAX在我的数据库中保存了一些文本.AJAX和我一起工作得很好.我的问题是,当我将数据保存在我的数据库中并尝试在我的屏幕上打印时,它会返回一个奇怪的文本.我使用PHP函数mb_detect_encoding来确定数据库如何处理文本.该函数返回UTF-8.所以我使用iconv("windows-1256","UTF-8",$ row ["text"])在屏幕上打印文本,但它仍然返回这个奇怪的东西.请伸出手,谢谢
我有特殊字符的数据(法国口音严重).当我用php脚本和输出(打印)选择它看起来很好.当我传递给Smarty时,角色会被改变.我的html有以下设置:meta http-equiv ="content-type"content ="text/html; charset = utf-8"不确定缺少什么或不正确?
克里斯
我试图在这个例子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) 我正在尝试上传具有阿拉伯名称的文件(مرحبابكم),但是当我将其上传到服务器时,字符串不正确,它会显示这样的字符(ريÙ-Ù).
那么,我如何上传文件并保留正确的阿拉伯名字?
<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) 我试图用我的数据库中的重音安全西班牙语单词,但它不会工作,我已经尝试过:
1)将表和行的连接更改为utf8_spanish_ci和utf_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) 概括
我正在尝试使用准备好的语句来停止 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 上安全地执行?
当浏览器在 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 请求接收到的数据?
我有一个从 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 文件。所以我猜一个按值或按行操作的解决方案可能不够好?