@1kbfree
2018-05-14T11:18:29.000000Z
字数 2892
阅读 1293
PHP
因为没有输入密码 所以执行错误,打印了catch语句里的内容
exec():
返回SQL语句执行后受影响的行数
就是这样:
所以一般增删改都用exec(),这样子我们就可以很清楚的知道是否执行成功,如果exec()返回的结果为0,那么这肯定是没成功执行(增删改)的。
query():
返回SQL语句执行后放回的数据
先看看数据库里都有什么数据:
<?php
// ... ...(其他省略,主要看sql语句和query的用法)
$sqlTotal = "select * from t1";
$s = $smtTotal = $pdo->query($sqlTotal);
foreach ($s as $key){
print_r($key);
}
// ... ...
?>
页面上返回的结果:
所以,一般是用来查询的都是用query(),这样我们就可以看到查询到的结果了。
<?php
/*这样可以防SQL注入,DVWA的impossible级别也是这样写的*/
$pdo = new PDO('mysql:host=localhost;dbname=blog','root','root');
$pdo->exec('set names utf8'); //设置编码
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC); //设置默认结果集模式为关联数组
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //修改报错模式
$sql_query = "select * from users where id=(:id)";
$pre2 = $pdo -> prepare($sql_query); //准备要执行的SQL语句并返回一个 PDOStatement 对象
$pre2 -> bindParam(':id',$id,PDO::PARAM_INT); //绑定参数,想成是把:id的值替换成$id变量里的值
$id = $_GET['id']; //获取GET请求过来的ID值
$pre2 -> execute(); //执行这个SQL语句
$row = $pre2 -> fetch(); //fetch()是返回执行结果(无论怎么查询,最多只能返回一条数据)
print_r($row); //打印查询的结果
?>
结果:
也可以这样的方式:
这样子是有好处的,比如表单提交过来的数据就是一个数组,我们可以通过直接传递数组,方便许多。
DVWA里impossible级别的SQL注入测试代码:
<?php
if( isset( $_GET[ 'Submit' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$id = $_GET[ 'id' ];
// Was a number entered?
if(is_numeric( $id )) {
// Check the database
$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
$data->bindParam( ':id', $id, PDO::PARAM_INT );
$data->execute();
$row = $data->fetch();
// Make sure only 1 result is returned
if( $data->rowCount() == 1 ) {
// Get values
$first = $row[ 'first_name' ];
$last = $row[ 'last_name' ];
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
}
}
// Generate Anti-CSRF token
generateSessionToken(); // 这个是DVWA里的防止CSRF的,可以不用管
?>
上面的fetch()只返回一条数据,我们可以用fetchALL来返回多条数据
<?php
//$sql_query = "select * from users where id=(:id)";
$sql_query = "select * from users where id>(:id)";
$pre2 = $pdo -> prepare($sql_query); //准备要执行的SQL语句并返回一个 PDOStatement 对象
$pre2 -> bindParam(':id',$id,PDO::PARAM_INT); //绑定参数,想成是把:id的值替换成$id变量里的值
$id = $_GET['id']; //获取GET请求过来的ID值
$pre2 -> execute(); //执行这个SQL语句
$row = $pre2 -> fetchALL(); //fetch()是返回执行结果
foreach ($row as $key){
print_r($key);
echo "<br>";
}
?>
结果:
比如我们去银行汇款的时候,由于某些问题,收款人未收到金额,这个时候汇款人肯定会找银行解决这个问题的,那么久需要用到事物处理了,将用户汇过去的钱还原到数据库里
首先我创建了一个表,里面有one和two用户,他们的存款都有1000:
我们先开启事物处理start transaction;
:
然后这个时候当one用户想给two用户转100元的时候,出现了问题:
这里one用户的钱没汇到two账户里,却仍然扣除了100元,那么银行知道了事情的真实性,肯定会去处理的,这个时候我们就要用到rollback
了,可以回轨(悔棋~)
fetchColumn():
从结果集中的下一行获取第一列
<?php
$sql_query = "select * from users where id>(:id)";
$pre2 = $pdo -> prepare($sql_query); //准备要执行的SQL语句并返回一个 PDOStatement 对象
$pre2 -> bindParam(':id',$id,PDO::PARAM_INT); //绑定参数,想成是把:id的值替换成$id变量里的值
$id = $_GET['id']; //获取GET请求过来的ID值
$pre2 -> execute(); //执行这个SQL语句
print_r($pre2 -> fetchColumn());
echo "<br />";
print_r($pre2 -> fetchColumn());
echo "<br />";
foreach ($row as $key){
print_r($key);
echo "<br>";
}
?>
返回的结果:
对比数据库里的数据来看:
我们可以看到这个fetchColumn()
就是返回数据库里的第一列的数据,这里的第一列是Id,而且我打印了2次,所以对应的输出为7、1,这个结果相当于$row['id']