php怎么改自己名字,php-是否使用“设置名称”

TLDR

// The key is the "charset=utf8" part.

$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8';

$dbh = new PDO($dsn, 'user', 'pass');

这个答案强调了php的pdo库,因为它无处不在。

简要提醒一下-mysql是一种客户端-服务器体系结构。 这很重要,因为不仅存在实际数据库所在的mysql服务器,而且还有单独的mysql客户端驱动程序,该驱动程序与mysql服务器通信(它们是独立的实体)。 您可能会说mysql客户端和pdo混合在一起。

当使用ütube时,会向mysql发出标准的sql查询。 虽然sql查询确实通过pdo,然后通过mysql客户端库,最后到达mysql服务器,但只有mysql服务器会解析并解释该sql查询。 这很重要,因为mysql服务器不会将任何消息发送回pdo或mysql客户端,让它知道字符集和编码已更改,因此mysql客户端和pdo都完全不知道发生了这一事实。

请勿这样做很重要,因为如果客户端库不知道当前字符集,则它将无法正确处理字符串。 大多数常见的操作将在客户端不知道正确的字符集的情况下正确运行,但是不会进行字符串转义,例如PDO :: quote。 您可能会认为您不需要担心此类原始字符串的转义,因为您使用的是预备语句,但事实是绝大多数pdo:mysql用户在不知不觉中使用模拟的预备语句,因为它是pdo:mysql的默认设置 司机已经很长时间了。 模拟的预处理语句不使用mysql api提供的真正的本地mysql预处理语句; 取而代之的是,php等效于在所有值上调用ütube,并用引用的值对所有占位符进行str_replacing处理。

由于除非您知道所使用的字符集,否则您无法正确地转义字符串,因此,如果您已通过ütube更改为某些字符集,则这些模拟的预准备语句很容易受到sql注入的影响。无论是否有sql注入的可能性,您都可以 如果您使用用于其他字符集的转义方案,仍然可以中断字符串。

对于pdo mysql驱动程序,可以在连接时通过在DSN中指定字符集来指定字符集。 如果您这样做,则客户端库和服务器都将知道字符集,因此事情将按应有的方式工作。

// The key is the "charset=utf8" part.

$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8';

$dbh = new PDO($dsn, 'user', 'pass');

但是不正确的字符串转义并不是唯一的问题。 例如,由于列名被指定为字符串,因此使用PDO :: bindColumn也可能会遇到问题,因此编码也很重要。 一个示例可能是名为ütube(请注意变音符)的列名,并且您通过设置名称从latin切换到utf8,然后尝试将2568116158884299779更改为$stmt->bindColumn('ütube', $var);,其中ütube是utf8编码的字符串,因为您的php文件是utf8编码的。 它行不通,您需要将字符串编码为latin1变体...现在您正在经历各种疯狂的事情。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值