@1kbfree
2018-05-14T03:18:29.000000Z
字数 2892
阅读 1729
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注入测试代码:
<?phpif( isset( $_GET[ 'Submit' ] ) ) {// Check Anti-CSRF tokencheckToken( $_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 returnedif( $data->rowCount() == 1 ) {// Get values$first = $row[ 'first_name' ];$last = $row[ 'last_name' ];// Feedback for end userecho "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}}}// Generate Anti-CSRF tokengenerateSessionToken(); // 这个是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']