PHP pdo单例模式连接数据库
';
if ( self::$pdo == null )
{
$host = '11529223160';
$user = 'zhangwei';
$pwd = 'zhang111';
$dbname = 'wangzhan';
$dsn = "mysql:host=$host;dbname=$dbname;port=3306";
$pdo = new PDO ( $dsn, $user, $pwd );
$pdo->query('set names utf8;');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
self::$pdo = $pdo;
}
return self::$pdo;
}
public static function getStmt ( $sql )
{
$pdo = self::getPdo ();
return $pdo -> prepare( $sql );
}
}
$sql = "INSERT INTO testss (wef,wef1) VALUES(,)";
$stmt = Db::getStmt ( $sql );
$stmt = Db::getStmt ( $sql );
>
输出结果
NULL
object(PDO)#1 (0) { }
第一次null 第二次再获取就已经有了 不用重新连接了
单利模式好处就是保存变量 他是用static保存的 所以 退出函数 变量不会释放
关于这个问题,差不多就是这个样子的了,你如果不明白,可以自己去后盾瞅瞅,我这些都是在后盾上学的,有空可以去看一下,就算不喜欢也没关系啊,何乐而不为呢?
是语法错误,是没有找到函数的错误,是没有加载PDO扩展造成的。
PHP中查看phpinfo参数,是否加载并扩展了PDO,需要加载,否则解释错误
更多问题到问题求助专区>
本文实例讲述了PHP利用pdo_odbc实现连接数据库。分享给大家供大家参考,具体如下:
目的:从sql
server数据库里面把某个视图文件调用出来,以键值对的方式显示在页面上。
利用pdo
odbc来实现PHP连接数据库:
在PHP配置文件里面开启pdo_odbcdll服务。重启Apache服务器。
在ThinkPHP51的项目中在模块里添加config添加规定好的样式数据库:
代码如下:
<php
return
[
//
数据库类型
'type'
=>
'sqlsrv',
//
服务器地址
'hostname'
=>
'localhost',
//
数据库名
'database'
=>
'mysql',
//
用户名
'username'
=>
'sa',
//
密码
'password'
=>
'123456',
//
端口
'hostport'
=>
'',
//
连接dsn
'dsn'
=>
'odbc:Driver={SQL
Server};Server=localhost;Database=mysql',
//
数据库连接参数
'params'
=>
[],
//
数据库编码默认采用utf8
'charset'
=>
'utf8',
//
数据库表前缀
'prefix'
=>
'',
//
数据库调试模式
'debug'
=>
true,
//
数据库部署方式:0
集中式(单一服务器),1
分布式(主从服务器)
'deploy'
=>
0,
//
数据库读写是否分离
主从式有效
'rw_separate'
=>
false,
//
读写分离后
主服务器数量
'master_num'
=>
1,
//
指定从服务器序号
'slave_no'
=>
'',
//
是否严格检查字段是否存在
'fields_strict'
=>
true,
//
数据集返回类型
'resultset_type'
=>
'array',
//
自动写入时间戳字段
'auto_timestamp'
=>
false,
//
时间字段取出后的默认时间格式
'datetime_format'
=>
'Y-m-d
H:i:s',
//
是否需要进行SQL性能分析
'sql_explain'
=>
false,
//
Builder类
'builder'
=>
'',
//
Query类
'query'
=>
'\\think\\db\\Query',
//
是否需要断线重连
'break_reconnect'
=>
false,
//
断线标识字符串
'break_match_str'
=>
[],
];
>
在控制器controller里面建一个控制文件Testphp
代码如下:
<php
namespace
app\index\controller;
use
think\Db;
use
think\Controller;
class
Test
extends
Controller
{
public
function
zz(){
$data=Db::view('View_2')->select();
echo
json_encode($data);
}
}
>
最后调用入口文件即可访问。
>
mysql系的函数中都是逐行读取的,即第一次mysql_fetch_array得到第一行,第二次得到第二行你可以自己定义一个函数来读取所有行,例如
function mysql_fetch_all($result) {
$rows = array();
while($row=mysql_fetch_array($result))
$rows[] = $row;
return $rows;
}
更好的办法建议你用pdo方式访问mysql,这个也是php目前推荐的方式(php5开始pdo库默认在phpini中已经启用,而mysql系列默认是不启用的)。pdo提供了fetch_all方法取得所有行及fetch方法取得一行。
更多信息请查看php手册中的说明。
感谢题主的邀请,我来说下我的答案,依我看来,CANopen PDO通信方式有三种触发模式,分别为:内部事件驱动或内部定时器触发、同步触发、远程请求触发。
一、 内部事件驱动或内部定时器触发。通讯由某一事件触发。例如数字 I/O 口状态改变,超过预先设定的值、定时器中断等都会触发节点发送一个 PDO。这种模式可使总线负载达到最小,在相对低的波特率下获得比较高的通讯特性。
二、同步触发。同步触发 PDO 是指 CANopen 节点收到由管理节点发出的同步报文(同步对象 Sync)之后,根据触发报文条件向总线发出 PDO 报文。同步传输又分为周期性和非周期性,周期性是指 CANopen 节点接收到一定数量的同步报文之后才开始发送;非周期性 PDO 是指 PDO 触发条件成立之后,当收到下一个同步对象后马上发送PDO。
三、 远程请求触发。PDO 消费者可以给 PDO 生产者发送远程 PDO 请求,相应 PDO 生产者将对远程帧做出响应,向总线上发送相应的 PDO 数据。
如果你还想了解更多有关这方面的信息的话,请网上询问广成科技。
采纳下啊!
您好,您没弄好,再弄一次:
1、PDO配置。打开phpini配置文件,找到下图所示的配置信息,去掉要启用的PDO前面的“#”号即可。另外一种方式是直接在启动的wampserver中找到php扩展中的php_pdo_dblib选项,重启wampserver服务器即可。
2、如何利用PDO连接数据库。利用下面这条简单的语句即可连接数据库,$pdo = newPDO("mysql:host=localhost;dbname=php100","root",“ ");
3、PDO中常用的函数及其解释如下。
PDO::query()主要是用于有记录结果返回的 *** 作,特别是SELECT *** 作
PDO::exec()主要是针对没有结果集合返回的 *** 作,如INSERT、UPDATE等 *** 作
PDO::lastInsertId() 返回上次插入 *** 作,主键列类型是自增的最后的自增ID
PDOStatement::fetch()是用来获取一条记录
PDOStatement::fetchAll()是获取所有记录集到一个中 。
4、
下面通过一个简单的php代码示例来具体介绍如何使用PDO进行数据库 *** 作。
<php
//连接数据库
$pdo = new PDO("mysql:host=localhost; dbname=member", "root","");
//在表user_list中插入数据
$pdo->exec("insert into user_list(uid, m_id, username, password) values(null,'3','testpdo','testpdo')");
//使用查询语句
$sr = $pdo->query("select from user_list");
//将查询的结果循环输出显示
while($row=$sr->fetch()){
print_r($row);
}
>
要构建的无限分类的模型 电子产品是最大的分类家用电器 ,数码产品是其子分类可以看到子分类是被父分类包含起来的每个分类都有左右 两个节点编号分别是1、2、3
根据上面的图mysql中建立表和插入数据
CREATE TABLE `product_categories` (
`id` MEDIUMINT( 8 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,`name` VARCHAR( 20 ) NOT NULL ,
`left_node` MEDIUMINT( 8 ) NOT NULL ,
`right_node` MEDIUMINT( 8 ) NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;INSERT INTO `product_categories` (`id`, `name`, `left_node`, `right_node`) VALUES(1, '电子产品', 1, 20),
(2, '家用电器', 2, 9),
(3, '电视机', 3, 4),
(4, '电冰箱', 5, 6),
(5, '空调', 7, 8),
(6, '数码产品', 10, 19),
(7, '电脑', 11, 18),
(8, '台式电脑', 12, 13),
(9, '笔记本电脑', 14, 15),
(10, '平板电脑', 16, 17);
表结构如下:
下面是PHP的实例代码:
1、获取所有节点
<php
$pdo = new PDO(
'mysql:host=localhost;dbname=test',
'root',
''
);
$pdo->exec("SET NAMES UTF8");
$stmt = $pdo->prepare("SELECT cname FROM product_categories as c, product_categories as pWHERE cleft_node BETWEEN pleft_node AND pright_nodeAND pname='电子产品' ORDER BY cleft_node");$stmt->execute();
$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($rs as $v){
echo $v['name']'<br />';
}
输出:
电子产品
家用电器
电视机
电冰箱
空调
数码产品
电脑
台式电脑
笔记本电脑
平板电脑
2、 获取某个父节点以及其所有子节点
<php
$pdo = new PDO(
'mysql:host=localhost;dbname=test',
'root',
''
);
$pdo->exec("SET NAMES UTF8");
$stmt = $pdo->prepare("SELECT cname FROM product_categories as c, product_categories as pWHERE cleft_node BETWEEN pleft_node AND pright_nodeAND pname='数码产品' ORDER BY cleft_node");$stmt->execute();
$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($rs as $v){
echo $v['name']'<br />';
}
输出:
数码产品
电脑
台式电脑
笔记本电脑
平板电脑
3、获取所有的叶子节点
<php
$pdo = new PDO(
'mysql:host=localhost;dbname=test',
'root',
''
);
$pdo->exec("SET NAMES UTF8");
$stmt = $pdo->prepare("SELECT name FROM product_categories where right_node-left_node=1");$stmt->execute();
$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($rs as $v){
echo $v['name']'<br />';
}
输出:
电视机
电冰箱
空调
台式电脑
笔记本电脑
平板电脑
4、获取某个子节点及其所有父节点
<php
$pdo = new PDO(
'mysql:host=localhost;dbname=test',
'root',
''
);
$pdo->exec("SET NAMES UTF8");
$stmt = $pdo->prepare("SELECT pname FROM product_categories AS c, product_categories AS p WHERE cleft_node BETWEEN pleft_node AND pright_node AND cname = '平板电脑' ORDER BY pleft_node");$stmt->execute();
$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($rs as $v){
echo $v['name']'<br />';
}
输出:
电子产品
数码产品
电脑
平板电脑
5、获取所有节点极其所处的层级
<php
$pdo = new PDO(
'mysql:host=localhost;dbname=test',
'root',
''
);
$pdo->exec("SET NAMES UTF8");
$stmt = $pdo->prepare("SELECT cname, (COUNT(pname) - 1) AS level FROM product_categories AS c, product_categories AS p WHERE cleft_node BETWEEN pleft_node AND pright_node GROUP BY cname ORDER BY cleft_node");$stmt->execute();
$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($rs);
echo '<br />';
foreach($rs as $v){
echo $v['name']' level:'$v['level']'<br />';}
输出:
电子产品 level:0
家用电器 level:1
电视机 level:2
电冰箱 level:2
空调 level:2
数码产品 level:2
电脑 level:2
台式电脑 level:3
笔记本电脑 level:3
平板电脑 level:3
6、获取某个节点的层级
<php
$pdo = new PDO(
'mysql:host=localhost;dbname=test',
'root',
''
);
$pdo->exec("SET NAMES UTF8");
$stmt = $pdo->prepare("SELECT cname, (COUNT(pname) - 1) AS level FROM product_categories AS c, product_categories AS p WHERE cleft_node BETWEEN pleft_node AND pright_node and cname='平板电脑' GROUP BY cname ORDER BY cleft_node");$stmt->execute();
$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($rs);
echo '<br />';
foreach($rs as $v){
echo $v['name']' level:'$v['level']'<br />';}
输出:
平板电脑 level:3
7、在某个节点后平行的插入一个节点
<php
$pdo = new PDO(
'mysql:host=localhost;dbname=test',
'root',
''
);
$pdo->exec("SET NAMES UTF8");
function addNode($left_node,$new_node){
global $pdo;
$stmt = $pdo->prepare("SELECT right_node FROM product_categories WHERE name = '$left_node'");$stmt->execute();
$rs=$stmt->fetch(PDO::FETCH_ASSOC);
$right_node=$rs['right_node'];
$pdo->exec("UPDATE product_categories SET right_node = right_node + 2 WHERE right_node > $right_node");$pdo->exec("UPDATE product_categories SET left_node = left_node + 2 WHERE left_node > $right_node");$pdo->exec("INSERT INTO product_categories(name, left_node, right_node) VALUES('$new_node', $right_node + 1, $right_node + 2)");}
addNode('家用电器','办公用品');
完成之后表结构如下:
8、删除某个节点及其所有子节点
<php
$pdo = new PDO(
'mysql:host=localhost;dbname=test',
'root',
''
);
$pdo->exec("SET NAMES UTF8");
function deleteNode($node_name){
global $pdo;
$stmt = $pdo->prepare("SELECT left_node,right_node, right_node - left_node + 1 as width FROM product_categories WHERE name ='$node_name'");$stmt->execute();
$rs=$stmt->fetch(PDO::FETCH_ASSOC);
$left_node=$rs['left_node'];
$right_node=$rs['right_node'];
$width=$rs['width'];
$pdo->exec("DELETE FROM product_categories WHERE left_node BETWEEN $left_node AND $right_node");$pdo->exec("UPDATE product_categories SET right_node = right_node - $width WHERE right_node > $right_node");$pdo->exec("UPDATE product_categories SET left_node = left_node - $width WHERE left_node > $right_node");}
deleteNode('数码产品');
完成之后表结构如下:
可以看到用多叉树的方式构建无限分类,查询的时候是非常简便的但是在插入新的节点和删除节点时就比较麻烦了
假设你系统里数据库请求的函数是 pdo_query (你自己根据情况调整),表名是tblcate
另外,这段代码使用到了array_column函数,该函数从php55起才有,如果你的版本较低,要找一个兼容函数放到函数库里(官方文档评论中就有实现)
以下是代码文本 如果复制过去出现T_VARIABLE错误,就是代码中字符被系统混掉了,你要重新手打一下
//这里根据你的意思,应该是选出没有下级的节点,如果需要全部或其它的,你根据情况修改,不影响后面的其它 *** 作
$selectedNodes = pdo_query("select from tblcate where pid not in(select pid from tblcate)");
//选出全部节点
$allNodes = pdo_query("select from tblcate ");
//将节点数据使用id索引,方便获取
$allNodes = array_column($allNodes, NULL, 'id');
foreach($selectedNodes as &$node){
$tree = getParentNode($node['pid']);
//这里的$tree 是上级名称拼起来的,不包含本级名称,如要包含,在后面附加上就行了
$node['tree'] = implode(',',$tree);
}
unset($node);
var_export($selectedNodes );
function getParentNode($pid){
global $allNodes;
$pnodes=[];
if($pid> 0 && isset($allNodes[$pid])){
$pNode = $allNodes[$pid];
$pnodes[]= $pNode['name'];
$rnodes = getParentNode($pNode['pid']);
if(!empty($rnodes)){
$pnodes = array_merge($pnodes,$rnodes);
}
}
return $pnodes;
}
以上就是关于php pdo单例模式怎么同时连接两个数据库全部的内容,包括:php pdo单例模式怎么同时连接两个数据库、yaf框架中,PHP Fatal error: Call to a member function prepare() on a non-object;、PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)