検索
ホームページバックエンド開発PHPチュートリアルMysqli_set_charset と SET NAMES の使用法の選択と長所と短所の分析_PHP チュートリアル

最近、同社は PHP セキュリティ プログラミング トレーニングを開催しました。これには、Mysql の "SET NAMES" および mysql_set_charset (mysqli_set_charset) に関する内容が含まれていました:
そういえば、"SET NAMES" の代わりに mysqli_set_charset (mysqli:set_charset) を使用してみてください。この内容は PHP マニュアルにも記載されていますが、その理由は説明されていません

最近、何人かの友人が私にこの質問をしました。なぜですか? 質問する人がたくさんいるので、ブログを書こうと思いました。この部分を具体的に紹介します。
まず、多くの人は「SET NAMES」が何をするのか知りません。
私の前回の記事では、MySQL の 3 つの「character_set_client/character_set_connection/character_set_results」環境変数について詳しく説明しました。 " については、ここで簡単に紹介します。
これら 3 つの変数は、MySQL サーバー、クライアントのエンコーディング セット、MySQL サーバーに送信するときのエンコーディング セット、および MySQL によって返されることが期待される結果のエンコーディング セットを伝えます。
たとえば、次のように使用します。 「SET NAMES utf8」は、私が utf-8 エンコードを使用していることをサーバーに伝えます。また、クエリ結果も utf-8 エンコードで返してほしいと願っています

通常、「SET NAMES」を使用するだけで十分です。では、なぜマニュアルには mysqli_set_charset (PHP>=5.0.5) を使用することが推奨されているのでしょうか? まず、mysqli_set_charset が何をするのかを見てみましょう (アスタリスクのコメントに注意してください。mysql_set_charset は似ています)。


コードをコピーします コードは次のとおりです:
//php-5.2.11-SRC/ext/mysqli/mysqli_nonapi.c line 342
PHP_FUNCTION(mysqli_set_charset)
MY_MY SQL*mysql ; zval*mysql_link ;
char *cs_name = NULL;
unsigned int len;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis()
, "Os", &mysql_link, mysqli_link_class_entry, &cs_name, &len) = = 失敗) {
reターン;
}
MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link"
, MYSQLI_STATUS_VALID);
if (mysql_set_character_set(mysql->mysql, cs_name)) {
//**libmysql の対応する関数を呼び出します
RETURN_FALSE;
}


コードをコピーします

コードは次のとおりです:
//私のSQL-5.1.30 -SRC/libmysql/client.c、行 3166:
int STDCALLmysql_set_character_set(MYSQL*mysql, const char *cs_name)
{
structcharset_info_st *cs;
const char *save_csdir= charsets_dir;オプション .charset_dir )
charsets_dir = mysql->options.charset_dir; if (strlen(cs_name) (cs= get_charset_by_csname(cs_name, MY_CS_PRIMARY, MYF(0)))) { char buff[MY_CS_NAME_SIZE + 10] ;
charsets_dir = save_csdir
/* 4.1 より前のサーバーの場合は「SET NAMES」の実行をスキップします。 */
の場合 ( mysql_get_server_version(mysql) sprintf(buff, "SET NAMES %s", cs_name);
if (!mysql_real_query(mysql, buff, strlen(buff)); charset= cs;
}
}
//以下は省略されています


「SET NAMES」に加えて、mysqli_set_charset がもう 1 つのステップも実行していることがわかります:



コードをコピーします

コードは次のとおりです以下:


sprintf(buff , "SET NAMES %s", cs_name);
if (!mysql_real_query(mysql, buff, strlen(buff)))
{
mysql->charset= cs;

mysql のコア構造について メンバー charset の役割は何ですか?

この関数と mysql_escape_string の違いは、「現在の」文字セットを考慮するということです。文字セットの由来は?
はい、ご想像のとおり、mysql->charset です。たとえば、ワイド文字セットの文字を判断する場合、mysql_real_string はこのメンバー変数に基づいてさまざまな戦略を使用します。 8 の場合、libmysql/ctype-utf8.c が使用されます。
例を見てください。デフォルトの mysql 接続文字セットは latin-1 です (古典的な 5c の問題): コードをコピーします
コードは次のとおりです。以下:


$ db = mysql_connect('localhost:3737', 'root' ,'123456');
$a = "x91x5c";// gbk 「慭」のエンコード、下位バイトは 5c、ascii の「」です
var_dump(addslashes($a))
var_dump(mysql_real_escape_string($a, $db));
mysql_query("set names gbk"); ; var_dump(mysql_real_escape_string($a, $db) )); mysql_set_charset("gbk");


なぜなら、「慭」の下位バイトの gbk エンコードは 5c (ascii では「」) であり、mysql->charset に影響を与える mysql(i)_set_charset を除いて、mysql->charset は他のバージョンのデフォルト値であるからです。
コードをコピーします コードは次のとおりです:

$ php -f 5c.php
string(3) ""
string(3) ""
string (3) " "
string(2) "慭"もう皆さんには分かりましたか?

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/326354.html技術記事最近、同社は PHP セキュリティ プログラミング トレーニングを開催しました。これには、Mysql の「SET NAMES」と mysql_set_charset (mysqli_set_charset) に関する内容が含まれていました。そういえば、mysqli を使ってみてください...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
详解MyBatis动态SQL标签中的Set标签功能详解MyBatis动态SQL标签中的Set标签功能Feb 26, 2024 pm 07:48 PM

MyBatis动态SQL标签解读:Set标签用法详解MyBatis是一个优秀的持久层框架,它提供了丰富的动态SQL标签,可以灵活地构建数据库操作语句。其中,Set标签是用于生成UPDATE语句中SET子句的标签,在更新操作中非常常用。本文将详细解读MyBatis中Set标签的用法,以及通过具体的代码示例来演示其功能。什么是Set标签Set标签用于MyBati

PHP Fatal error: Call to undefined function mysqli_connect()的解决方法PHP Fatal error: Call to undefined function mysqli_connect()的解决方法Jun 23, 2023 am 09:40 AM

在使用PHP编写Web应用程序时,经常会使用MySQL数据库来存储数据。PHP提供了一种与MySQL数据库进行交互的方法,称为MySQLi。然而,有时在使用MySQLi时,会遇到一个错误信息,如以下所示:PHPFatalerror:Calltoundefinedfunctionmysqli_connect()这个错误信息意味着PHP无法找到my

华硕主板与R55600(包括R55600u和5600h)兼容的选择华硕主板与R55600(包括R55600u和5600h)兼容的选择Jan 02, 2024 pm 05:32 PM

R55600搭配华硕哪个主板华硕ROGStrixB550-FGaming主板是一个非常出色的选择。它与Ryzen55600X处理器完美兼容,并提供出色的性能和功能。该主板具备可靠的供电系统,可支持超频,并提供丰富的扩展插槽和端口,满足日常使用和游戏需求。ROGStrixB550-FGaming还配备了高品质的音频解决方案、快速的网络连接和可靠的散热设计,确保系统保持高效稳定。此外,该主板还采用了华丽的ROG风格,配备了华丽的RGB照明效果,为您的计算机增添了视觉享受。总而言之,华硕ROGStri

php无法连接mysqli怎么办php无法连接mysqli怎么办Nov 09, 2022 am 10:07 AM

php无法连接mysqli的解决办法:1、打开“php.ini”文件;2、找到“mysqli.reconnect”;3、将“mysqli.reconnect = OFF”改成“mysqli.reconnect = on”即可。

赛扬g4900与i36100相比哪个更优?(赛扬g4900与i34170相比哪个更优?)赛扬g4900与i36100相比哪个更优?(赛扬g4900与i34170相比哪个更优?)Jan 01, 2024 pm 06:01 PM

赛扬g4900和i36100哪个好当涉及到赛扬G4900和I36100这两款处理器时,毫无疑问,I36100的性能更胜一筹。赛扬处理器通常被视为低端处理器,主要用于廉价笔记本电脑。而I3处理器则主要用于高端处理器,其性能非常出色。不论是玩游戏还是观看视频,使用I3处理器都不会出现任何卡顿情况。因此,如果你有可能,尽量选择购买英特尔I系列处理器,特别是用于台式机,这样你就能畅享网络世界的乐趣了。赛扬G4900T性能怎么样从性能方面来看,奔腾G4900T在频率方面表现出色,相比之前的版本,CPU性能

mysql的运行文件是什么mysql的运行文件是什么Apr 11, 2023 am 10:38 AM

mysql的运行文件是mysqld;mysqld是一个可执行文件,代表着Mysql服务器程序,执行这个文件可以直接启动一个服务器进程;而mysqld_safe是一个启动脚本,它会间接调用mysqld,并且还会顺带启动一个监控进程。

PHP PDO 与 mysqli:比较和对比PHP PDO 与 mysqli:比较和对比Feb 19, 2024 pm 12:24 PM

PDOPDO是一个面向对象的数据库访问抽象层,它为PHP提供了一个统一的接口,允许您使用相同的代码与不同的数据库(如Mysql、postgresql、oracle)进行交互。PDO隐藏了底层数据库连接的复杂性,简化了数据库操作。优缺点优点:统一接口,支持多种数据库简化数据库操作,降低开发难度提供预处理语句,提高安全性支持事务处理缺点:性能可能比原生扩展稍低依赖外部库,可能会增加开销演示代码使用PDO连接mysql数据库:$db=newPDO("mysql:host=localhost;dbnam

PHP Warning: mysqli_connect(): (HY000/2002): Connection refused的解决方法PHP Warning: mysqli_connect(): (HY000/2002): Connection refused的解决方法Jun 23, 2023 am 08:54 AM

如果你使用PHP连接MySQL数据库时遇到了以下错误提示:PHPWarning:mysqli_connect():(HY000/2002):Connectionrefused那么你可以尝试按照下面的步骤来解决这个问题。确认MySQL服务是否正常运行首先应该检查MySQL服务是否正常运行,如果服务未运行或者启动失败,就可能会导致连接被拒绝的错误。你可

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン