标签: phpphp
先在这里贴一下代码:html
<?php //链接数据库 $link = mysqli_connect('127.0.0.1','root','') or die('链接失败!'); //设置字符串编码 mysqli_query($link,"set names utf8"); //选择数据库 //session_start(); mysqli_select_db($link,'user'); //获取表单数据 //对密码进行MD5加密 $username = $_POST['username']; $password = md5($_POST['userword']); //检测用户名及密码是否正确,执行sql查询 $check_query = "select * from user where userName = {$username}"; $result = mysqli_query($link,$check_query); //获取记录数 //取得结果集中行的数目 $num = mysqli_num_rows($result); echo $num; // 用户存在 if($num){ /* mysql_fetch_array从结果集中取得一行做为关联数组,或数字数组,或两者兼有 */ $row=mysql_fetch_array($result); //对密码进行判断 if($password===$row['userPassword']){ echo "登录成功!"; //header() 函数向客户端发送原始的 HTTP 报头。 //header("location:index.php"); }else{ echo "密码不正确"; //echo "<a href='login.php'>返回登录页面</a>"; } }else{ echo "用户不存在"; //echo "<a href='login.php'>返回登录页面</a>"; } ?>
做为一个php小白,写了40行代码,挖了很多坑,你们能够借助一下这段代码检验一下本身的水平,哈哈哈哈哈。
下面讲述的步骤,是我在逐渐解决的过程。mysql
报的第一个错误是关于mysql_num_rows()的sql
mysql_num_rows() expects mysqli_result 1 to be resource,boolean given数据库
这个报错字面意思是这个函数的参数应该接受一个resource的参数,但实际运行时,传进去的参数是一个布尔值。
做为一个学习的心态,仍是应该先找一下关于这个函数的解释:数组
用法:int mysql_num_rows ( resource $result )
mysql_num_rows() 返回结果集中行的数目。此命令仅对 SELECT 语句有效。要取得被 INSERT,UPDATE 或者 DELETE 查询所影响到的行的数目,用 mysql_affected_rows()。session
在个人代码中,$result是查询后的结果,个人代码应该看起来没有问题,而错误提示$result是一个布尔值,多是个人查询语句出现了问题。函数
如今php菜鸟教程中找了其返回值的状况:学习
针对成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询,将返回一个 mysqli_result 对象。针对其余成功的查询,将返回 TRUE。若是失败,则返回 FALSE
看到这里,看到mysqli_result对象感受看到了家人。以为顿时有了头绪。
关于$link:
我在mysqli_query()中传入的参数$link实际上是不对的,这个资源标识符是我登陆数据库时候返回的,而不是选择数据时候返回的。而数据库才是我操做的对象,其中的逻辑千万要搞明白。fetch
最后的问题就是出在了这里。
先说一下php里的变量解析:
在单引号字符串中的变量和特殊含义的字符将不会被替换。
用双引号定义的 字符串 最重要的特征是变量会被解析
第一种状况:
$name = 'lan'; echo '我是$name';
这在状况下,变量会被看成字符串处理,会输出
我是$name
$name = 'lan'; echo "我是$name";
在这种状况下,变量会被解析,输出:
我是lan
详情参见玩转php变量解析
php中的{}
在我查找php拼接字符串的过程当中,主要出现了两种方法,一个就是直接使用双引号进行变量解析,另一种是使用.符号进行拼接。
双引号出现了一种写法:{$username} 让我有一些困惑,在这里也说一下其做用:
(1). 表示{}里面的是一个变量 ,执行时按照变量来处理
(2). 在字符串中引用变量使用的特殊包括方式,这样就能够不使用.运算符,从而减小代码的输入量了
(3). 防止变量名和后面的字符串连在一块儿
使用.拼接sql语句
这是我在mysql的phpMyAdmin中自动生成的查询语句
SELECT * FROM `user` WHERE `userName` LIKE 'lan'
而这是我在运行的过程当中输出的拼接后的字符串:
SELECT * FROM `user` WHERE `userName` LIKE lan
仔细一下观察一下能够看出输出的语句中最后lan是没有单引号的,这就是错误的根源了,可怜我一直没有看到。
最后拼接成了这个样子:
$check_query = "SELECT * FROM `user` WHERE `userName` LIKE"."'".$username."'";
md5() 函数计算字符串的 MD5 散列。主要用于加密.
调试到后面,前面的都能正确运行,但就是一直输出密码不对,想到,也许从数据库里读取的数据,也要进行md5处理才能和进过md5处理的密码比较,一试,果真对了。
其实能够在一开始注册的时候,就把密码md5加密储存在数据中。
是时候好好看看调试方法了