小白爬坑须知:php语言发送Sql语句遇到的问题
小标 2018-07-12 来源 : 阅读 1332 评论 0

摘要:本文主要向大家介绍了php语言发送Sql语句遇到的问题,通过具体的实例向大家展示,希望对大家学习php语言有所帮助。

本文主要向大家介绍了php语言发送Sql语句遇到的问题,通过具体的实例向大家展示,希望对大家学习php语言有所帮助。

先在这里贴一下代码:

<?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_num_rows()

报的第一个错误是关于mysql_num_rows()的

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()。

在我的代码中,$result是查询后的结果,我的代码应该看起来没有问题,而错误提示$result是一个布尔值,可能是我的查询语句出现了问题。

坑二:发送sql语句

现在php菜鸟教程中找了其返回值的情况:

针对成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询,将返回一个 mysqli_result 对象。针对其他成功的查询,将返回 TRUE。如果失败,则返回 FALSE

看到这里,看到mysqli_result对象感觉看到了家人。觉得顿时有了头绪。 关于$link: 我在mysqli_query()中传入的参数$link其实是不对的,这个资源标识符是我登录数据库时候返回的,而不是选择数据时候返回的。而数据库才是我操作的对象,其中的逻辑千万要搞明白。

坑三:sql语句

最后的问题就是出在了这里。

1. 先说一下php里的变量解析:

在单引号字符串中的变量和特殊含义的字符将不会被替换。 用双引号定义的 字符串 最重要的特征是变量会被解析

第一种情况:

$name = 'lan';echo '我是$name';

这在情况下,变量会被当作字符串处理,会输出

我是$name

$name = 'lan';echo "我是$name";

在这种情况下,变量会被解析,输出:

我是lan

详情参见玩转php变量解析 2. php中的{} 在我查找php拼接字符串的过程中,主要出现了两种方法,一个就是直接使用双引号进行变量解析,另外一种是使用.符号进行拼接。 双引号出现了一种写法:{$username} 让我有一些困惑,在这里也说一下其作用:

(1). 表示{}里面的是一个变量 ,执行时按照变量来处理 (2). 在字符串中引用变量使用的特殊包括方式,这样就可以不使用.运算符,从而减少代码的输入量了 (3). 防止变量名和后面的字符串连在一起

1. 使用.拼接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处理的密码比较,一试,果然对了。 其实可以在一开始注册的时候,就把密码md5加密储存在数据中。

总结

是时候好好看看调试方法了

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言PHP频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程