当先锋百科网

首页 1 2 3 4 5 6 7

今天非常坑,就用写博客来发泄吧。。。

<html>
<form action="./sql.php" method="get">
账号<input type = "text" name = "u"><br>
密码<input type = "text" name = "p"><br>
    <input type = "submit" value = "登录">
</form>
</html>

<?php
 header('Content-Type:text/html;charset=utf-8');
 include('./connect.php'); //引入数据库配置文件
 $username = $_GET['u'];
 $password = $_GET['p'];
 echo $username.$password."<br>";
 $sql = "select username,password from user where password = '$password'";
 //$sql = "select username,password from user where 1=2";
 echo $sql."<hr>";
 $select_sql_result = mysql_query($sql);
 var_dump($select_sql_result);
 echo "<br>";
 if(!$select_sql_result)
     echo "wrong"."<br>";
 else echo "success!!!"."<br>";

 while($res=mysql_fetch_assoc($select_sql_result)){
    foreach($res as $key=>$value){
      echo $key.":".$value.'<br />';
    }
}
?>

先分析一下mysql_query

mysql_query() 函数执行一条 MySQL 查询。

语法

mysql_query(query,connection)

参数描述
query必需。规定要发送的 SQL 查询。注释:查询字符串不应以分号结束。
connection可选。规定 SQL 连接标识符。如果未规定,则使用上一个打开的连接。

说明

如果没有打开的连接,本函数会尝试无参数调用 mysql_connect() 函数来建立一个连接并使用之。

返回值

mysql_query() 仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。

对于其它类型的 SQL 语句,mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE。

非 FALSE 的返回值意味着查询是合法的并能够被服务器执行。这并不说明任何有关影响到的或返回的行数。很有可能一条查询执行成功了但并未影响到或并未返回任何行。

运行代码之后发现if(!$select_sql_result)总是对的,无论你输入什么,而且mysql_query()返回的总是资源类型,除非sql语句不合语法,它才会返回FLASE,看到上面的绿色部分,即使mysql_query()执行成功,也可能不会返回结果,也就是查询结构为空,如下图,但是它不是bool FALSE 这种情况它只会返回资源类型

想要对查询结果进行判断是否为空,可以用mysql_num_rows()和mysql_affected_rows()

1.)mysql_num_rows() 函数返回结果集中行的数目。

语法

mysql_num_rows(data)
参数描述
data必需。结果集。该结果集从 mysql_query() 的调用中得到。

说明

mysql_num_rows() 返回结果集中行的数目。此命令仅对 SELECT 语句有效。要取得被 INSERT,UPDATE 或者 DELETE 查询所影响到的行的数目,用 mysql_affected_rows()

2.)

mysql_affected_rows() 函数返回前一次 MySQL 操作所影响的记录行数。

语法

mysql_affected_rows(link_identifier)
参数描述
link_identifier必需。MySQL 的连接标识符。如果没有指定,默认使用最后被 mysql_connect() 打开的连接。如果没有找到该连接,函数会尝试调用 mysql_connect() 建立连接并使用它。如果发生意外,没有找到连接或无法建立连接,系统发出 E_WARNING 级别的警告信息。

说明

取得最近一次与 link_identifier 关联的 INSERT,UPDATE 或 DELETE 查询所影响的记录行数。

所以代码可以改为
 

<html>
<form action="./sql.php" method="get">
账号<input type = "text" name = "u"><br>
密码<input type = "text" name = "p"><br>
    <input type = "submit" value = "登录">
</form>
</html>

<?php
 header('Content-Type:text/html;charset=utf-8');
 include('./connect.php'); //引入数据库配置文件
 $username = $_GET['u'];
 $password = $_GET['p'];
 echo $username.$password."<br>";
$sql = "select username,password from user where password = '$password'";
// $sql = "select username,password from user where 1=2";
 echo $sql."<hr>";
 $select_sql_result = mysql_query($sql);
 var_dump($select_sql_result);
 echo "<br>";
 if(mysql_num_rows($select_sql_result)===0)
     echo "wrong";
 /*if(!$select_sql_result)
     echo "wrong"."<br>";*/
 else echo "success!!!"."<br>";

 while($res=mysql_fetch_assoc($select_sql_result)){
    foreach($res as $key=>$value){
      echo $key.":".$value.'<br />';
    }
}
?>

真是心累。。。。。