首页 > 编程技术 > php

pdo连接数据类与中文乱码解决方法

发布时间:2016-11-25 16:38

1.pdo简介
pdo(php教程 data object) 是php 5 中加入的东西,是php 5新加入的一个重大功能,因为在php 5以前的php4/php3都是一堆的数据库教程扩展来跟各个数据库的连接和处理,什么 php_mysql教程.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll等等。
php6中也将默认使用pdo的方式连接,mysql扩展将被作为辅助
2.pdo配置
php.ini中,去掉"extension=php_pdo.dll"前面的";"号,若要连接数据库,还需要去掉与pdo相关的数据库扩展前面的";"号,然后重启apache服务器即可。
extension=php_pdo.dll
extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
extension=php_pdo_mssql.dll
extension=php_pdo_odbc.dll
extension=php_pdo_firebird.dll
......
3.pdo连接mysql数据库
new pdo("mysql:host=localhost;dbname=db_demo","root","");
默认不是长连接,若要使用数据库长连接,需要在最后加如下参数:
new pdo("mysql:host=localhost;dbname=db_demo","root","","array(pdo::attr_persistent => true) ");
4.pdo常用方法及其应用
pdo::query() 主要是用于有记录结果返回的操作,特别是select操作
pdo::exec() 主要是针对没有结果集合返回的操作,如insert、update等操作
pdo::lastinsertid() 返回上次插入操作,主键列类型是自增的最后的自增id
pdostatement::fetch() 是用来获取一条记录
pdostatement::fetchall() 是获取所有记录集到一个中
5.pdo操作mysql数据库实例


复制代码 代码如下:

<?php
$pdo = new pdo("mysql:host=localhost;dbname=db_demo","root","");
if($pdo -> exec("insert into db_demo(name,content) values('title','content')")){
echo "插入成功!";
echo $pdo -> lastinsertid();
}
?>


 

复制代码 代码如下:

<?php
$pdo = new pdo("mysql:host=localhost;dbname=db_demo","root","");
$rs = $pdo -> query("select * from test");
while($row = $rs -> fetch()){
print_r($row);
}
?>

 

网上最常出现的解决中文乱码显示的代码是:

第一种:pdo::__construct($dsn, $user, $pass, array

(pdo::mysql_attr_init_command => "set names'utf8';"));

我试过用第一种方法,可结果是,name字段只显示一个‘c'字符。之后的本该显示中文的地方却是空白。

结果是这样的:如图1示

我是只要解决的:直接将utf8替换成了gbk,就可以了,即:

pdo::__construct($dsn, $user, $pass, array(pdo::mysql_attr_init_command => "set

names'gbk';"));

效果图2如下:


第二种:pdo::__construct($dsn, $user, $pass);

pdo::exec("set names 'utf8';");

第二种我也在我的环境里测试过,显示效果如图1所示,碰到这种情况,把utf8替换成gbk,就能显

示了。另外,这里的pdo::在使用的时候用$pdo->代替,当然,这个是个变量,变量名称可以自己定义。

第三种

:$pdo->query('set names utf8;');

至于第三种呢,看了上面两种,应该也知道要吧utf8替换成gbk,也能正确显示了。

这几种我都测试过了。都行。哈哈。另外,我在这里还介绍一种解决中文乱码的一种方法,不过大同小异,

基本和第三种没什么却别,不通的是,这种方法,没用query而是用exec,代码如下:

$pdo->exec("set character set gbk");

<?php
/*

常用数据库操作,如:增删改查,获取单条记录、多条记录,返回最新一条插入记录id,返回操作记录行数等
*/
/*
参数说明
int $debug 是否开启调试,开启则输出sql语句
int $getcount 是否记数,返回值为行数
int $getrow 是否返回值单条记录
string $table 数据库表
string $fields 需要查询的数据库字段,允许为空,默认为查找全部
string $sqlwhere 查询条件,允许为空
string $orderby 排序,允许为空,默认为id倒序
*/

function hrselect($debug, $getcount, $getrow, $table, $fields="*", $sqlwhere="", $orderby="id desc"){
global $pdo;
if($debug){
if($getcount){
echo "select count(*) from $table where 1=1 $sqlwhere order by $orderby";
}else{
echo "select $fields from $table where 1=1 $sqlwhere order by $orderby";
}
exit;
}else{
if($getcount){
$rs = $pdo->query("select count(*) from $table where 1=1 $sqlwhere order by $orderby");
return $rs->fetchcolumn();
}elseif($getrow){
$rs = $pdo->query("select $fields from $table where 1=1 $sqlwhere order by $orderby");
return $rs->fetch();
}else{
$rs = $pdo->query("select $fields from $table where 1=1 $sqlwhere order by $orderby");
return $rs->fetchall();
}
}
}
/*
参数说明
int $debug 是否开启调试,开启则输出sql语句
int $execrow 是否开启返回执行条目数
int $lastinsertid 是否开启返回最后一条插入记录id
string $table 数据库表
string $fields 需要插入数据库的字段
string $values 需要插入数据库的信息,必须与$fields一一对应
*/
function hrinsert($debug, $execrow, $lastinsertid, $table, $fields, $values){
global $pdo;
if($debug){
echo "insert into $table ($fields) values ($values)";
exit;
}elseif($execrow){
return $pdo->exec("insert into $table ($fields) values ($values)");
}elseif($lastinsertid){
return $pdo->lastinsertid("insert into $table ($fields) values ($values)");
}else{
$pdo->query("insert into $table ($fields) values ($values)");
}
}
/*
参数说明
int $debug 是否开启调试,开启则输出sql语句
int $execrow 是否开启执行并返回条目数
string $table 数据库表
string $set 需要更新的字段及内容,格式:a='abc',b=2,c='2010-10-10 10:10:10'
string $sqlwhere 修改条件,允许为空
*/
function hrupdate($debug, $execrow, $table, $set, $sqlwhere=""){
global $pdo;
if($debug){
echo "update $table set $set where 1=1 $sqlwhere";
exit;
}elseif($execrow){
return $pdo->exec("update $table set $set where 1=1 $sqlwhere");
}else{
$pdo->query("update $table set $set where 1=1 $sqlwhere");
}
}
/*
参数说明
int $debug 是否开启调试,开启则输出sql语句
int $execrow 是否开启返回执行条目数
string $table 数据库表
string $sqlwhere 删除条件,允许为空
*/
function hrdelete($debug, $execrow, $table, $sqlwhere=""){
global $pdo;
if($debug){
echo "delete from $table where 1=1 $sqlwhere";
exit;
}elseif($execrow){
return $pdo->exec("delete from $table where 1=1 $sqlwhere");
}else{
$pdo->query("delete from $table where 1=1 $sqlwhere");
}
}
?>

分享一下 我所用的方法。只对php教程myadmin导出的sql文件有效

$dbfile="test.sql";
 $content=iconv("utf-8","gb2312",file_get_contents($dbfile));
 //获取创建的数据
 //去掉注释
 $content=preg_replace("/--.*n/iu","",$content);
 //替换前缀
 $content=str_replace("ct_",table_pre,$content);

$carr=array();
 $iarr=array();
 //提取create
 preg_match_all("/create table .*(.*).*;/ius",$content,$carr);
 $carr=$carr[0];
 foreach($carr as $c)
 {
  @mysql教程_query($c,$link);
 }
 
 //提取insert
 preg_match_all("/insert into .*(.*);/ius",$content,$iarr);
 $iarr=$iarr[0];
 //插入数据
 foreach($iarr as $c)
 {
  @mysql_query($c,$link);
 }

 

php教程记录搜索引擎蜘蛛爬行记录代码

<center>
<form action="setup.php" method="post">
<table align="center">
<tr>

<td>服务器:</td><td><input value="localhost" name="server" /></td>
</tr>
<tr>
<td>用户名:</td><td><input value="数据库教程用户名" name="sqluser" /></td>
</tr>
<tr>
<td>密&nbsp;&nbsp;码:</td><td><input value="数据库密码" name="sqlpass" /></td>
</tr>
<tr>
<td>库名称:</td><td><input value="数据库名称" name="sqldb" /></td>
</tr>
<tr>
<td>管理员账号:</td><td><input value="admin" name="adminname" /></td>
</tr>
<tr>
<td>管理员密码:</td><td><input value="admin" name="adminpass" /></td>
</tr>

<tr>
<td></td><td ><input type="submit" value="开始安装" /></td>
</tr>
</table>
</form>


</center>

setup.php文件

<?php

@$server = $_post['server'];
@$sqluser = $_post['sqluser'];
@$sqlpass = $_post['sqlpass'];
@$sqldb = $_post['sqldb'];
@$adminname=$_post['adminname'];
@$adminpass=md5($_post['adminpass']);
@$conn = mysql教程_connect($server, $sqluser, $sqlpass) or die("<script>alert('数据库无法链接,请检查用户名和密码是否有误');history.back();</script>");
$db = mysql_select_db($sqldb) or die("<script>alert('数据库无法找到,请检查数据库名称是否填写有误!');history.back();</script>");


$sql1="set foreign_key_checks=0";
$sql2="drop table if exists `robots`";
$sql3="create table `robots` (
  `id` int(11) not null auto_increment,
  `robotsname` varchar(200) default null,
  `robotsip` varchar(200) default null,
  `riqi` date default null,
  `shijian` time default null,
  `robotspage` varchar(255) default null,
  primary key (`id`)
) engine=innodb default charset=gbk";

$sql1ok=mysql_query($sql1,$conn);
$sql2ok=mysql_query($sql2,$conn);
$sql3ok=mysql_query($sql3,$conn);
if (!$sql1ok or !$sql2ok or !$sql3ok) {
    echo "<script>alert('您的mysql存在严重性故障,程序无法继续安装,请联系程序作者!');location.href='http://www.axphp.com';</script>";
} else
{
    $conntext = file_get_contents("conn.setup");
    $conntext = str_replace("server", $server, $conntext);
    $conntext = str_replace("user", $sqluser, $conntext);
    $conntext = str_replace("pass", $sqlpass, $conntext);
    $conntext = str_replace("mysqldb", $sqldb, $conntext);
    $conntext = str_replace("adminzh",$adminname,$conntext);
    $conntext = str_replace("adminmmpas",$adminpass,$conntext);
    file_put_contents("../config.php", $conntext);
    rename("setup.php","setup.lock");
    echo "<script>alert('恭喜,安装成功!');location.href='../index.html';</script>";
}
?>

zz.php文件

<?php
include_once 'config.php';
@$ax_ym=$_server['request_uri'];
@$ax_ss=$_server['http_user_agent'];
@$ax_url=$_server['http_referer'];
@$ax_ip=$_server['remote_addr'];
@$ax_date=date("y-m-d");
@$ax_time=date("h:i:s");
$baidu=stristr($ax_ss,"baiduspider");
$google=stristr($ax_ss,"googlebot");
$soso=stristr($ax_ss,"sosospider");
$youdao=stristr($ax_ss,"youdaobot");
$bing=stristr($ax_ss,"bingbot");
$sogou=stristr($ax_ss,"sogou web spider");
$yahoo=stristr($ax_ss,"yahoo! slurp");
if($baidu)
{
    $ax_ss="baidu";
}
elseif($google)
{
    $ax_ss="google";
}
elseif($soso)
{
    $ax_ss="soso";
}
elseif($youdao)
{
    $ax_ss="youdao";
}
elseif($bing)
{
    $ax_ss="bing";
}
elseif($sogou)
{
    $ax_ss="sogou";
}
elseif($yahoo)
{
    $ax_ss="yahoo";
}
else
{
    $ax_ss=null;
}


if($baidu or $google or $soso or $youdao or $bing or $sogou or $yahoo)
{
    $zzsql="insert into robots (robotsname,robotspage,robotsip,riqi,shijian) values ('$ax_ss','$ax_ym','$ax_ip','$ax_date','$ax_time')";
    $exeok=mysql_query($zzsql,$conn);
}
?>

在要抓蜘蛛页面加上

include('zz.php')
或js调用
<script" width=100% src="zz.php"></script>

源码下载

http://down.111cn.net/down/tool/o/2011/0311/22881.html

pdo的mysql教程数据库教程操作类
* dbconfig类负责配置数据库访问信息,包括:服务器地址、端口、数据库实例名、用户名、用户密码、字符集等。
  * dbtemplate类集合了对数据库的访问操作,主要有以下几个操作:
  1. queryrows : 返回多行记录
  2. queryrow : 返回为单条记录
  3. queryforint : 查询单字段,返回整数
  4. queryforfloat : 查询单字段,返回浮点数(float)
  5. queryfordouble : 查询单字段,返回浮点数(double)
  6. queryforobject : 查询单字段,返回对象,实际类型有数据库决定
  7. update : 执行一条更新语句. insert / upadate / delete

 */

class dbconfig {

    private static $dbms = "mysql";
    private static $host = '127.0.0.1';
    private static $port = '3306';
    private static $username = '';
    private static $password = '';
    private static $dbname = '';
    private static $charset = 'utf-8';
    private static $dsn;

    /**
     *
     * @return   返回pdo dsn配置
     */
    public static function getdsn() {
        if (!isset(self::$dsn)) {
            self::$dsn = self::$dbms . ':host=' . self::$host . ';port=' .
                    self::$port . ';dbname=' . self::$dbname;
            if (strlen(self::$charset) > 0) {
                self::$dsn = self::$dsn . ';charset=' . self::$charset;
            }
        }
        return self::$dsn;
    }

    /**
     * 设置mysql数据库服务器主机
     * @param  $host 主机的ip地址
     */
    public static function sethost($host) {
        if (isset($host) && strlen($host) > 0)
            self::$host = trim($host);
    }

    /**
     * 设置mysql数据库服务器的端口
     * @param  $port 端口
     */
    public static function setport($port) {
        if (isset($port) && strlen($port) > 0)
            self::$port = trim($port);
    }

    /**
     * 设置mysql数据库服务器的登陆用户名
     * @param  $username
     */
    public static function setusername($username) {
        if (isset($username) && strlen($username) > 0)
            self::$username = $username;
    }

    /**
     * 设置mysql数据库服务器的登陆密码
     * @param  $password
     */
    public static function setpassword($password) {
        if (isset($password) && strlen($password) > 0)
            self::$password = $password;
    }

    /**
     * 设置mysql数据库服务器的数据库实例名
     * @param  $dbname 数据库实例名
     */
    public static function setdbname($dbname) {
        if (isset($dbname) && strlen($dbname) > 0)
            self::$dbname = $dbname;
    }

    /**
     * 设置数据库编码
     * @param  $charset
     */
    public static function setcharset($charset) {
        if (isset($charset) && strlen($charset) > 0)
            self::$charset = $charset;
    }

}

/**
 * 一个数据库操作工具类
 *
 * @author zhjiun@gmail.com
 */
class dbtemplate {

    /**
     * 返回多行记录
     * @param  $sql
     * @param  $parameters
     * @return  记录数据
     */
    public function queryrows($sql, $parameters = null) {
        return $this->exequery($sql, $parameters);
    }

    /**
     * 返回为单条记录
     * @param  $sql
     * @param  $parameters
     * @return
     */
    public function queryrow($sql, $parameters = null) {
        $rs = $this->exequery($sql, $parameters);
        if (count($rs) > 0) {
            return $rs[0];
        } else {
            return null;
        }
    }

    /**
     * 查询单字段,返回整数
     * @param  $sql
     * @param  $parameters
     * @return
     */
    public function queryforint($sql, $parameters = null) {
        $rs = $this->exequery($sql, $parameters);
        if (count($rs) > 0) {
            return intval($rs[0][0]);
        } else {
            return null;
        }
    }

    /**
     * 查询单字段,返回浮点数(float)
     * @param  $sql
     * @param  $parameters
     * @return
     */
    public function queryforfloat($sql, $parameters = null) {
        $rs = $this->exequery($sql, $parameters);
        if (count($rs) > 0) {
            return floatval($rs[0][0]);
        } else {
            return null;
        }
    }

    /**
     * 查询单字段,返回浮点数(double)
     * @param  $sql
     * @param  $parameters
     * @return
     */
    public function queryfordouble($sql, $parameters = null) {
        $rs = $this->exequery($sql, $parameters);
        if (count($rs) > 0) {
            return doubleval($rs[0][0]);
        } else {
            return null;
        }
    }

    /**
     * 查询单字段,返回对象,实际类型有数据库决定
     * @param  $sql
     * @param  $parameters
     * @return
     */
    public function queryforobject($sql, $parameters = null) {
        $rs = $this->exequery($sql, $parameters);
        if (count($rs) > 0) {
            return $rs[0][0];
        } else {
            return null;
        }
    }

    /**
     * 执行一条更新语句.insert / upadate / delete
     * @param  $sql
     * @param  $parameters
     * @return  影响行数
     */
    public function update($sql, $parameters = null) {
        return $this->exeupdate($sql, $parameters);
    }

    private function getconnection() {
        $conn = new pdo(dbconfig::getdsn(), dbconfig::getusername(), dbconfig::getpassword());
        $conn->setattribute(pdo::attr_case, pdo::case_upper);
        return $conn;
    }

    private function exequery($sql, $parameters = null) {
        $conn = $this->getconnection();
        $stmt = $conn->prepare($sql);
        $stmt->execute($parameters);
        $rs = $stmt->fetchall();
        $stmt = null;
        $conn = null;
        return $rs;
    }

    private function exeupdate($sql, $parameters = null) {
        $conn = $this->getconnection();
        $stmt = $conn->prepare($sql);
        $stmt->execute($parameters);
        $affectedrows = $stmt->rowcount();
        $stmt = null;
        $conn = null;
        return $affectedrows;
    }
}


/*
pdo始于php教程5,php6中将默认使用pdo。不同于以前版本中混乱的数据库操作方式,pdo统一了对数据库的访问方式,给编程带来了极大的便利性。本工具类就是基于pdo,模拟了java世界spring框架中的jdbctemplate操作类
 */

我们一般是获取表单提交的数据,如果下面我们利用checkbox[]来操作,下面看实例。
-->

<form id="form1" name="form1" method="post" action="">
  1
  <input type="checkbox" name="checkbox[]" id="checkbox" value="1" />
  2
  <input type="checkbox" name="checkbox[]" id="checkbox2" value="2"  />
  3
  <input type="checkbox" name="checkbox[]" id="checkbox3" value="3" />
 
  <input type="submit" name="button" id="button" value="提交" />
</form>


<?
if( $_post )
{
 print_r( $_post );
 //输也是以数据形式保存的,
 /*
 array
 (
  [checkbox] => array
   (
    [0] => 1
    [1] => 2
    [2] => 3
   )
 
  [button] => 提交
 )
 
 这样就好操作了,我们只要如下
 */
 $array = $_post['checkbox'];
 print_r( $array );
 /*
 得到内容如下
 
 array
 (
  [0] => 1
  [1] => 2
  [2] => 3
 )

 其实1,2,3就是我们想要的内容,我们就可以利用sql的in来批量实现删除了。
*/
 $ids = implode(',',$array );
 $sql ="delete from 表名 where id in($ids ) ";
 mysql教程_query($sql);
 
 //这样就实现的数据的批量删除哦。
 //本站原创转载注明来源http://www.111cn.net 否则必究!
}

标签:[!--infotagslink--]

您可能感兴趣的文章: