preparephp
A. [追加30分] 请问php中如何操作mysql数据库。
//上面要有连接数据源的内容$link
$dpassword=$_POST[dpassword];
$sql="select * from test where dpassword='$dpassword'";
$result=mysql_query($sql,$link);
$row=mysql_num_rows($result);
if($row < 1){
echo "密码错误";
}else{
$sql="delete from test where dpassword='$dpassword'";
mysql_query($sql,$link);
echo "删除成功";
}
B. 在php扩展中,如果实现以下mysql功能一条语句实现
- Mysqli是php5之后才有的功能,没有开启扩展的朋友可以打开您的php.ini的配置文件。
查找下面的语句:;extension=php_mysqli.dll将其修改为:extension=php_mysqli.dll即可。
相对于mysql有很多新的特性和优势
(1)支持本地绑定、准备(prepare)等语法
(2)执行sql语句的错误代码
(3)同时执行多个sql
(4)另外提供了面向对象的调用接口的方法。
下面一一用php实例进行mysqli数据库连接!
使用方法一:使用传统的面向过程的方法
php代码如下:
<?php
$connect=mysqli_connect('localhost','root','','volunteer')ordie('Unaletoconnect');
$sql="select*fromvol_msg";
$result=mysqli_query($connect,$sql);
while($row=mysqli_fetch_row($result)){
echo$row[0];
}
?>
使用方法二:使用面向对象的方法调用接口(推荐使用)
看php代码如下:
复制代码代码如下:
<?php
//创建对象并打开连接,最后一个参数是选择的数据库名称
$mysqli=newmysqli('localhost','root','','volunteer');
//检查连接是否成功
if(mysqli_connect_errno()){
//注意mysqli_connect_error()新特性
die('Unabletoconnect!').mysqli_connect_error();
}
$sql="select*fromvol_msg";
//执行sql语句,完全面向对象的
$result=$mysqli->query($sql);
while($row=$result->fetch_array()){
echo$row[0];
}
?>
以上两个php实例运行的结果完全相同,可以清楚的看到使用mysqli类对象构建数据库连接的优势!
插入和修改记录我就不用讲了,只要更改一下sql语句就行,下一篇我会讲prepare接口特性!
C. PHP 使用 Mysqli 的 prepare 语句有什么好处
好处:
(1)解析查询只有一次
(2)执行一些查询优化步骤只有一次
(3)通过二进制协议发送参数比送他们为ASCII文本更有效
比如DATE,对于准备之后,发送日期只用3个字节;如果没有准备,日期必须以字符串的形式发送,需要数据库方再解析,这样需要发送10个字节。
(4)只有参数(不是整个查询文本)需要为每个执行要发送
(5)的MySQL直接存储parameteres到服务器上的缓冲区
(6)安全性也有帮助,就没有必要逃避或引用值。
坏处:
(1)本地到一个连接,以便另一个连接不能再使用
(2)不能使用MySQL查询缓存(5.1版本之前)
(3)不总是更有效,如果你使用它只有一次
(4)存储函数中不能使用(存储过程是可以的)
(5)有可能会导致“泄漏”如果你忘记释放它
D. yaf框架中,PHP Fatal error: Call to a member function prepare() on a non-object;
是语法错误,是没有找到函数的错误,是没有加载PDO扩展造成的。
PHP中查看phpinfo参数,是否加载并扩展了PDO,需要加载,否则解释错误
更多问题到问题求助专区http://bbs.hounwang.com/
E. PHP采用pdo方式访问数据库时,exec方法和prepare方法有什么区别
区别是:
PHP采用pdo方式访问数据库时,您不必再使用再为它们封装数据库操作类,只需要使用PDO接口中的方法就可以对各种数据库进行操作。
F. php 使用mysql 的prepare预编译,下面这段代码有防sql注入的功能么请高手赐教
sql注入怎么回事:说白了就是在一个单引号上做文章,你把单引号转义就没啥问题了,预编译就是把这些字符转义后插入,其中包括单引号。
这段可以防止.
G. php预处理执行为什么
预处理语句与存储过程 :
很多更成熟的数据库都支持预处理语句的概念。什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。预处理语句可以带来两大好处:
查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。简言之,预处理语句占用更少的资源,因而运行得更快。
提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。
预处理语句如此有用,以至于它们唯一的特性是在驱动程序不支持的时PDO 将模拟处理。这样可以确保不管数据库是否具有这样的功能,都可以确保应用程序可以用相同的数据访问模式。
Example #1 用预处理语句进行重复插入
下面例子通过用name和value替代相应的命名占位符来执行一个插入查询
<?php
$stmt=$dbh->prepare("INSERTINTOREGISTRY(name,value)VALUES(:name,:value)");
$stmt->bindParam(':name',$name);
$stmt->bindParam(':value',$value);
//插入一行
$name='one';
$value=1;
$stmt->execute();
//用不同的值插入另一行
$name='two';
$value=2;
$stmt->execute();
?>
Example #2 用预处理语句进行重复插入
下面例子通过用name和value取代?占位符的位置来执行一条插入查询。
<?php
$stmt=$dbh->prepare("INSERTINTOREGISTRY(name,value)VALUES(?,?)");
$stmt->bindParam(1,$name);
$stmt->bindParam(2,$value);
//插入一行
$name='one';
$value=1;
$stmt->execute();
//用不同的值插入另一行
$name='two';
$value=2;
$stmt->execute();
?>
Example #3 使用预处理语句获取数据
下面例子获取数据基于键值已提供的形式。用户的输入被自动用引号括起来,因此不会有 SQL 注入攻击的危险。
<?php
$stmt=$dbh->prepare("SELECT*FROMREGISTRYwherename=?");
if($stmt->execute(array($_GET['name']))){
while($row=$stmt->fetch()){
print_r($row);
}
}
?>
如果数据库驱动支持,应用程序还可以绑定输出和输入参数.输出参数通常用于从存储过程获取值。输出参数使用起来比输入参数要稍微复杂一些,因为当绑定一个输出参数时,必须知道给定参数的长度。如果为参数绑定的值大于建议的长度,就会产生一个错误。
Example #4 带输出参数调用存储过程
<?php
$stmt=$dbh->prepare("CALLsp_returns_string(?)");
$stmt->bindParam(1,$return_value,PDO::PARAM_STR,4000);
//调用存储过程
$stmt->execute();
print"procerereturned$return_value ";
?>
还可以指定同时具有输入和输出值的参数,其语法类似于输出参数。在下一个例子中,字符串“hello”被传递给存储过程,当存储过程返回时,hello 被替换为该存储过程返回的值。
Example #5 带输入/输出参数调用存储过程
<?php
$stmt=$dbh->prepare("CALLsp_takes_string_returns_string(?)");
$value='hello';
$stmt->bindParam(1,$value,PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,4000);
//调用存储过程
$stmt->execute();
print"procerereturned$value ";
?>
Example #6 占位符的无效使用
<?php
$stmt=$dbh->prepare("SELECT*FROMREGISTRYwherenameLIKE'%?%'");
$stmt->execute(array($_GET['name']));
//占位符必须被用在整个值的位置
$stmt=$dbh->prepare("SELECT*FROMREGISTRYwherenameLIKE?");
$stmt->execute(array("%$_GET[name]%"));
?>