我是靠谱客的博主 精明时光,最近开发中收集的这篇文章主要介绍php pdo数据库名和表,PDO查询缓存错和数据库中文表列名,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

PDO查询缓存错和数据库中文表列名

在php中用PDO操作数据库出错,用PDO::errorInfo()函数可以看到

SQLSTATE[HY000]:

General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll().

Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

操作中,凡是只查一次就不会出错,比如

$pdo->query($sql);

在这之前

$pdo->query('SET NAMES UTF8');

也没关系.但是,在这之前我写了一个建表的句子,

$c_sql = ("DROP TABLE IF EXISTS x3;CREATE TABLE x4 (x varchar(6),y varchar(6));");

$pdo->exec($sql);

执行,在后面的普通查询中就会出错.于是只好关闭$pdo再重连,比如

$pdo = null;

$pdo = new PDO($dsn);

又或者另建一个连接,

$pdo2  = new PDO($dsn);

难道PDO不能多次连着查询吗?或者要按上面说的设置属性PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 为 true?

但设了也不起作用,而且据网上查,有人说从php5.2.1起,这个属性已经默认为true了,我的版本是5.2.6.而且这方法只能在mysql起作用,那岂不是不能移植?

又查,有人说,PDO有bug,不支持一次返回多个查询结果,也就是PDOStatement的nextRowset不能正确执行,给的提示说是什么这是个可有可无的特性,又说,即使是mysql5.2.6,依然这样,而且他测试存储过程,也这种提示.并且说,这两个事情在linux版都没问题.见

http://www.cnblogs.com/bindsang/archive/2008/08/18/1270171.html

我的也是这个问题么?似乎又不一样.也不想回到mysql或mysqli,要知道PHP6中会移除非PDO的玩意.

又试,有人说,是应该先把上个缓存清了,比如

$result->fetchAll();

$result = null;

试了还不管用.把建表语句去掉,执行两次query,都可以,看来PDO::MYSQL_ATTR_USE_BUFFERED_QUERY的确已经默认是true了.

又试,把建表语句换成别的语句,比如update,正常.

最后想了想,反正建表是很少的,而且不用和其他在一起,比如作事务什么的.就这样吧.

最终还是php.net说得对,原来是建表语句一次只能执行一条,我于把那个语句分成两段,这下所有都正常了.

再说说中文表名和字段名,mysql5.0时曾说过将在mysql5.1支持.在mysql5.1中建表,表文件名中的中文字符会用utf8编码代替,比如'中'字会变成@4e2d,这样在库目录下就会有@4e2d.frm之类文件.但是在windows的控制台,看这样的中文是乱码,必须set names gbk;才正常显示,真是奇怪.sqlite因为没有set names命令,所以在控制台看到中文是乱码,只有sqlite spy勉强可以正常显示,除了字段中文名在树中显示不出来,在查询结果中能显示.用windows的chcp 65001来改变控制台的页代码为utf-8,然后把字体设为Lucida Console,再查,显示文字不全,最小化窗口再打开,能显全.但再查又不全,得反复重复刚才的操作,据ms文档说,可以在注册表中改控制台字体,不过没看明白.

在控制台,如果在sqlite中建一个中文表名,在脚本中或sqlite spy中看是乱码,也就是说不是UTF8的.mysql未设置时,会提示中文字不是合法的utf8字符,如果set names gbk; 然后再来,就一切正常,包括表名,字段名,和insert 中文,都正常,在phpmyadmin中看也是中文,似乎是windows下自己把这些字转成utf8了,就是这么怪.

在linux下,只在命令行下测试了sqlite2.8.7的版本和mysql5.0.24,都支持中文名.mysql5.0.24这个版本也支持让人有些惊讶,不过在命令行中一定要用`把中文表名或字段名包起来,否则要出错,不知道5.1的linux版本是不是也这样.

最后说一下,php脚本中最后查得的结果,输出中文键没问题,因为试了下,数组可以用中文作键,变量名也可以用中文.php文档中只说了可以用gb2312那样编码,但实际测试utf8的也行.

最后

以上就是精明时光为你收集整理的php pdo数据库名和表,PDO查询缓存错和数据库中文表列名的全部内容,希望文章能够帮你解决php pdo数据库名和表,PDO查询缓存错和数据库中文表列名所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部