php的SQL连接操作的方法
初学php,于是一开始就在sql(具体点说是mysql)里受挫严重。于是这里记下一些方法。
首先是基本方法。基本方法现在我不用了,所以我就附一下hustoj中的部分吧
基本方法的数据库连接操作:
1 if($OJ_SAE) {// for sae.sina.com.cn 2 mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 3 $DB_NAME=SAE_MYSQL_DB; 4 }else{ 5 //for normal install 6 if(!mysql_pconnect($DB_HOST,$DB_USER,$DB_PASS)) 7 die('Could not connect: ' . mysql_error()); 8 } 9 // use db 10 mysql_query("set names utf8"); 11 12 if(!mysql_select_db($DB_NAME)) 13 die('Can\'t use foo : ' . mysql_error());
顺带一提,我是通过阅读hustoj的代码入门的php,感谢hustoj这个开源项目。但是我依然想吐槽一下,hustoj的前台代码太烂了。。
这是使用PDO方法操作sql之前的初始化操作。(因为要在SAE上跑所以写了两个,现在需要在OpenShift跑所以改了一下,,附新的)
1 //db init 2 if ($ON_SAE) { 3 $pdo = new PDO('mysql:host='.SAE_MYSQL_HOST_M.';port='.SAE_MYSQL_PORT.';dbname='.SAE_MYSQL_DB, SAE_MYSQL_USER, SAE_MYSQL_PASS); 4 $pdo->query("set names utf8;"); 5 } else { 6 $pdo = new PDO("mysql:host=localhost;dbname=test","root","root"); 7 $pdo->query("set names utf8;"); 8 }
1 <?php 2 // From BLumiaOJ, include/setting_db.php 3 // DB Connection 4 switch ($ENV_CASE) { 5 case "SAE": 6 define('DB_HOST',SAE_MYSQL_HOST_M); 7 define('DB_PORT',SAE_MYSQL_PORT); 8 define('DB_USER',SAE_MYSQL_USER); 9 define('DB_PASS',SAE_MYSQL_PASS); 10 define('DB_NAME',SAE_MYSQL_DB); 11 break; 12 case "OPEN_SHIFT": 13 define('DB_HOST',getenv('OPENSHIFT_MYSQL_DB_HOST')); 14 define('DB_PORT',getenv('OPENSHIFT_MYSQL_DB_PORT')); 15 define('DB_USER',getenv('OPENSHIFT_MYSQL_DB_USERNAME')); 16 define('DB_PASS',getenv('OPENSHIFT_MYSQL_DB_PASSWORD')); 17 define('DB_NAME',getenv('OPENSHIFT_GEAR_NAME')); 18 break; 19 case "STD_MYSQL": 20 define('DB_HOST',$SQL_DB_HOST); 21 define('DB_PORT',$SQL_DB_PORT); 22 define('DB_USER',$SQL_DB_USER); 23 define('DB_PASS',$SQL_DB_PASS); 24 define('DB_NAME',$SQL_DB_NAME); 25 break; 26 } 27 28 $dsn = 'mysql:dbname='.DB_NAME.';host='.DB_HOST.';port='.DB_PORT; 29 $pdo = new PDO($dsn, DB_USER, DB_PASS); 30 $pdo->query("set names utf8;"); 31 ?>
PDO的好处在于防注入的东西。但是也需要一些特别的方法,下面会提及,接下来是操作数据库的例子。
常规方法(依然摘自hustoj的部分代码):
1 $sql="SELECT * FROM `mail` WHERE `mail_id`=".$vid." and to_user='".$_SESSION['user_id']."'"; 2 $result=mysql_query($sql); 3 $row=mysql_fetch_object($result);
处理得到的结果的方式很多样,根据需求实现就是了,这里不再阐述。
同样的部分,换做PDO写法则为:
1 $sql=$pdo->prepare("SELECT * FROM `tb_mail` WHERE `mail_id`=".$vid." and to_user='".$_SESSION['UID']."'"); 2 $sql->execute(); 3 $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接入和操作大致如此,如上仅供参考。如果有新科技的话我会补充进来,如果有错误还请评论指正。