初学php,于是一开始就在sql(具体点说是mysql)里受挫严重。于是这里记下一些方法。

首先是基本方法。基本方法现在我不用了,所以我就附一下hustoj中的部分吧

基本方法的数据库连接操作:

     if($OJ_SAE)    {//  for sae.sina.com.cn
mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
$DB_NAME=SAE_MYSQL_DB;
}else{
//for normal install
if(!mysql_pconnect($DB_HOST,$DB_USER,$DB_PASS))
die('Could not connect: ' . mysql_error());
}
// use db
mysql_query("set names utf8"); if(!mysql_select_db($DB_NAME))
die('Can\'t use foo : ' . mysql_error());

顺带一提,我是通过阅读hustoj的代码入门的php,感谢hustoj这个开源项目。但是我依然想吐槽一下,hustoj的前台代码太烂了。。

这是使用PDO方法操作sql之前的初始化操作。(因为要在SAE上跑所以写了两个,现在需要在OpenShift跑所以改了一下,,附新的)

     //db init
if ($ON_SAE) {
$pdo = new PDO('mysql:host='.SAE_MYSQL_HOST_M.';port='.SAE_MYSQL_PORT.';dbname='.SAE_MYSQL_DB, SAE_MYSQL_USER, SAE_MYSQL_PASS);
$pdo->query("set names utf8;");
} else {
$pdo = new PDO("mysql:host=localhost;dbname=test","root","root");
$pdo->query("set names utf8;");
}
 <?php
// From BLumiaOJ, include/setting_db.php
// DB Connection
switch ($ENV_CASE) {
case "SAE":
define('DB_HOST',SAE_MYSQL_HOST_M);
define('DB_PORT',SAE_MYSQL_PORT);
define('DB_USER',SAE_MYSQL_USER);
define('DB_PASS',SAE_MYSQL_PASS);
define('DB_NAME',SAE_MYSQL_DB);
break;
case "OPEN_SHIFT":
define('DB_HOST',getenv('OPENSHIFT_MYSQL_DB_HOST'));
define('DB_PORT',getenv('OPENSHIFT_MYSQL_DB_PORT'));
define('DB_USER',getenv('OPENSHIFT_MYSQL_DB_USERNAME'));
define('DB_PASS',getenv('OPENSHIFT_MYSQL_DB_PASSWORD'));
define('DB_NAME',getenv('OPENSHIFT_GEAR_NAME'));
break;
case "STD_MYSQL":
define('DB_HOST',$SQL_DB_HOST);
define('DB_PORT',$SQL_DB_PORT);
define('DB_USER',$SQL_DB_USER);
define('DB_PASS',$SQL_DB_PASS);
define('DB_NAME',$SQL_DB_NAME);
break;
} $dsn = 'mysql:dbname='.DB_NAME.';host='.DB_HOST.';port='.DB_PORT;
$pdo = new PDO($dsn, DB_USER, DB_PASS);
$pdo->query("set names utf8;");
?>

PDO的好处在于防注入的东西。但是也需要一些特别的方法,下面会提及,接下来是操作数据库的例子。

常规方法(依然摘自hustoj的部分代码):

     $sql="SELECT * FROM `mail` WHERE `mail_id`=".$vid." and to_user='".$_SESSION['user_id']."'";
$result=mysql_query($sql);
$row=mysql_fetch_object($result);

处理得到的结果的方式很多样,根据需求实现就是了,这里不再阐述。

同样的部分,换做PDO写法则为:

     $sql=$pdo->prepare("SELECT * FROM `tb_mail` WHERE `mail_id`=".$vid." and to_user='".$_SESSION['UID']."'");
$sql->execute();
$result=$sql->fetchAll();//$result[0]['content']

PDO取得的结果的处理方式也很多样,根据需要实现即可。

对于不同的需求,可以使用pdo处理的方式也不同。选择性使用fetch和fetchAll为好。fetch一般处理返回结果只有一行的比较方便,而fetchAll则处理多行的。另附一些别的参考代码(来自这里):

	$sql = "SELECT * FROM wp_posts  ";
$query = $pdo->query($sql);
foreach($query as $rs)
{
print_r($rs);
} $sql = "SELECT * FROM wp_posts ";
$query = $pdo->query($sql);
$result = $query->fetch();
foreach($query as $rs)
{
print_r($rs);
} $sql = "SELECT * FROM wp_posts ";
$query = $pdo->query($sql);
$result = $query->fetchAll();
print_r($result);

此外,PDO的好处在于某些时候可以更方便的防止注入等使得数据库接入更安全,方法类似下面这样:

上图是常规做法。

这个是应该改为的做法。

数据库的php接入和操作大致如此,如上仅供参考。如果有新科技的话我会补充进来,如果有错误还请评论指正。

php的SQL连接操作的方法的更多相关文章

  1. (修改)oracle11g监听多台主机配置,用pl/sql连接操作多个数据库详解

    很多朋友在开发项目中并不是每个人用一个数据库,而是有单独的一台主机作为开发的数据库服务器,这样,就需要我们的开发人员去连接它. 首先是进入oracle的 Net  Mananger:

  2. sql连接字符串的方法

    ----乌龟代码---合并列值 --********************************************************************************** ...

  3. SQL连接操作

    一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1 ...

  4. SQL 连接操作 及 查询分析

  5. 在 SQL Server 中查找活动的 SQL 连接

    在SQL Server中有几种方法可以找到活动的 SQL 连接.让我们看看一些使用 T-SQL 查询的简单快捷的方法. SP_WHO SP_WHO 是 SQL Server 内置的系统存储过程, 其他 ...

  6. SQL 2005 中查询或执行另外的数据库操作的方法

    原文:SQL 2005 中查询或执行另外的数据库操作的方法 摘要: 如果,你想在一台数据库服务器上,查询另一个台数据服务器的数据该如何做呢?如果,你想在同一台数据服务器上,在不同的数据库之间查询数据, ...

  7. SQL 经典回顾:JOIN 表连接操作不完全指南

    ​   2017-02-23 小峰 ITPUB 点击上方“蓝字”可以关注我们哦  |转载自:码农网 |原文链接:www.codeceo.com/article/sql-join-guide.html ...

  8. 把两个DataTable连接起来,相当于Sql的Inner Join方法

    在C#中把两个DataTable连接起来,相当于Sql的Inner Join方法 作者:浪漫十一狼在下面的例子中实现了3个Join方法,其目的是把两个DataTable连接起来,相当于Sql的Inne ...

  9. 远程连接sql server 数据库的方法

    今天找了半天,终于解决了如何从本地连接到远程sql server服务器的方法. 1.首先确保打开远程服务器的sql server配置管理器,确保TCP/IP协议开启 2.WebConfig的连接字符格 ...

随机推荐

  1. ASP.NET基于donetCHARTING的自动报表

    1,首先需要添加引用ChartExtents.dll和donetCHARTING.dll,资源百度大把. 2,配置图片生成类. using System; using System.Data; usi ...

  2. 部署sharepointform验证

    1  iis sharepoint v4 提供程序2  web service 验证提供程序3 创建web应用程序(选择基于身份验证模式,配置提供程序)4 创建网站集(空)5 创建网站集

  3. 查看Android数据库文件

    使用Eclipse DDMS的File Explorer不能能看到Data目录下面的东西,可能由下面原因引起的 手机没有Root  -- 可以使用Root大师 Data文件权限不够 -- 可以使用Ro ...

  4. 增加配置Apache2 管理 SVN 访问权限

    继续之前的 文章里的配置 配置Apache2 管理 SVN 一.修改配置/etc/httpd/conf.d/ subversion.conf <Location /svn/> DAV sv ...

  5. Android 使用BroadcastReceiver的几种方法

    发送自定义广播 全局广播 发送标准广播 1.定义广播接收器.(在发送广播前,需要先定义一个广播接收器,不然发了也是白发) public class MyBroadcastReceiver extend ...

  6. SSH安全登录(远程管理)22端口

    Linux管理Linux 先加密再发送数据,更安全 一    联机加密工具         非对称钥匙对加密         安装    默认安装    openssh              启动 ...

  7. mac/linux install hg

    MAC OSX 10.9: sudo port -v install mercurial or easy_install mercurial

  8. Python成长之路第二篇(3)_字典的置函数用法

    字典的置函数用法(字典dict字典中的key不可以重复) class dict(object): """ dict() -> new empty dictionar ...

  9. 注册表添加python

    win(python2.7)下: 执行此文件 #!/usr/bin/env python # encoding:utf-8 # # script to register Python 2.0 or l ...

  10. CodeForces 190A Vasya and the Bus

    本题是比较简单的,有几个坑要注意一下: 1.n==0&&m!=0  时输出 "Impossible" : 2.n==0&&m==0 时输出 ”0 0 ...