首页 > 编程技术 > php

教你用PHP写MySQL数据库用户认证系统

发布时间:2016-11-25 16:40

这两天受朋友的托付,要我帮他写一个使用MySQL数据库的用户认证系统。我当然不好推脱的,只得耗费了一晚上的休息时间,写了个很简单的PHP程序。

用户认证的原理很简单:首先需要用户在页面上填入用户名和密码,当然没注册的用户需要先注册。然后调用数据库搜索是否有相应的用户。假如有就确认,没有则提醒用户先注册。使用PHP来完成这一切很简单,但需要注重的是假如想在以后的页面中都能确认用户身份,使用PHP3我只能想出使用cookie的方法。要想使用session,就只能等待PHP4正式版的发布了!

第一步是做一个登录的页面,这儿就不多讲了。我只做了个极简单的,大家可以做得漂亮点。

第二步开始登录后的确认程序的设计。


??login.php:?
mysql_connect("localhost","user","password")
/*连接数据库,用户名和密码自行修改*/
or die("无法连接数据库,请重试");

mysql_select_db("userinfo")
or die("无法选择数据库,请重试");
$today=date("Y-m-d H:i:s");

$query="
select id
from usertbl
where name=$name and password=$password
/*从数据库中搜索和登录用户相应的资料*/
";
$result=mysql_query($query);
$numrows=mysql_num_rows($result);


if($numrows==0){
/*验证是否能找出相同资料的用户,不能则未注册*/
echo 非法用户
;
echo 请注册先
;
echo 重试
;
}

else{
$row=mysql_fetch_array($result);
$id=$row[0];
$query="
update usertbl
set lastlogin=$today
where id=$id";
$result=mysql_query($query);
SetCookie("usercookie", "欢迎你,$name");
/*这里使用了cookie,以方便之后的页面认证。
但我未开发完这一块。希望有爱好的朋友指正*/
echo 登录成功
;
echo 请进!
;
}

D:Accessdb1.mdb
用户名:Admin
密 码:123
请问如何在PHP与此文件建立连接

---------------------------------------------------------------

第一种方式是用ODBC,在ODBC治理器中为db1.mdb建一处系统数据源
名称:dbdsn (可以自己定)
驱动程序:Microsoft Access Driver (*.MDB)

代码:
...
$Conn = odbc_connect("dbdsn","admin","123"); //连接数据源
$Doquery=odbc_exec($Conn,"select * from 表名 where 条件");//执行查询
...


第二种方式是ADO
...
$conn=new COM("ADODB.Connection");
$dsn="DRIVER={Microsoft Access Driver (*.mdb)};DBQ=".realpath("path/db1.mdb");
$conn->open($dsn);
$sql="select * from 表名 where 条件";
$ru=$conn->Execute($sql);

PHP程序访问数据库,完全可以使用存储过程,有人认为使用存储过程便于维护
不过仁者见仁,智者见智,在这个问题上,偶认为使用存储过程意味着必须要DBA和开发人员更紧密配合,假如其中一方更变,则显然难以维护。
但是使用存储过程至少有两个最明显的优点:速度和效率。
使用存储过程的速度显然更快。
在效率上,假如应用一次需要做一系列SQL操作,则需要往返于PHP与ORACLE,不如把该应用直接放到数据库方以减少往返次数,增加效率。
但是在INTERNET应用上,速度是极度重要的,所以很有必要使用存储过程。
偶也是使用PHP调用存储过程不久,做了下面这个列子。

代码:--------------------------------------------------------------

//建立一个TEST表
CREATE TABLE TEST (
ID NUMBER(16) NOT NULL,
NAME VARCHAR2(30) NOT NULL,
PRIMARY KEY (ID)
);

//插入一条数据
INSERT INTO TEST VALUES (5, 'PHP_BOOK');

//建立一个存储过程
CREATE OR REPLACE PROCEDURE PROC_TEST (
p_id IN OUT NUMBER,
p_name OUT VARCHAR2
) AS
BEGIN
SELECT NAME INTO p_name
FROM TEST
WHERE ID = 5;
END PROC_TEST;
/

--------------------------------------------------------------------------------



PHP代码:--------------------------------------------------------------------------------

<?php

//建立数据库连接
$user = "scott"; //数据库用户名
$password = "tiger"; //密码
$conn_str = "tnsname"; //连接串(cstr : Connection_STRing)
$remote = true //是否远程连接
if ($remote) {
$conn = OCILogon($user, $password, $conn_str);
}
else {
$conn = OCILogon($user, $password);
}

//设定绑定
$id = 5; //预备用以绑定的php变量 id
$name = ""; //预备用以绑定的php变量 name

/** 调用存储过程的sql语句(sql_sp : SQL_StoreProcedure)
* 语法:
* BEGIN 存储过程名([[:]参数]); END;
* 加上冒号表示该参数是一个位置
**/
$sql_sp = "BEGIN PROC_TEST(:id, :name); END;";

//Parse
$stmt = OCIParse($conn, $sql_sp);

//执行绑定
OCIBindByName($stmt, ":id", $id, 16); //参数说明:绑定php变量$id到位置:id,并设定绑定长度16位
OCIBindByName($stmt, ":name", $name, 30);

//Execute
OCIExecute($stmt);

//结果
echo "name is : $name<br>";

?>

PHP运算符

下面我分别看一下PHP3的算术、字符串、逻辑与比较等运算符。   
1、算术运算符
  +:  $a $b 加 $a加上$b   -:  $a - $b 减 $a减去$b   *:  $a * $b 乘 $a乘以$b   /:  $a / $b 除 $a除以$b   %:  $a % $b 取模 $a除以$b的余数 假如两个操作数都是整型值(字符串将被转换为整型值),除号("/") 返回整型值(整除的值)。假如任一个操作数是浮点值,则做浮点除法。
2 字符串运算符   
字符串操作符只有字符串连接符 (".")。   $a = "Hello ";   $b = $a . "World!"; // now $b = "Hello World!"
3、赋值运算符   
基本的赋值运算符是 "="。   一个赋值表达式的值就是所赋给的值。例如, 表达式 $a = 3 的值是3。 这答应你这样做一些复杂的事情:     $a = ($b = 4) 5; // 现在 $a 等于 9, $b为4 。   除了基本赋值符外,还有"复合运算符"。对于所有的二进制数和字符串,答应你做变量自我复合运算。
例如:   =: $a = 3;   +=:$a = 5; // 把$a 设成 8, 也就是: $a = $a 5;      $b = "Hello ";   . :$b .= "There!"; // 把 $b 设成 "Hello There!", 就象 $b = $b . "There!";
4、 位运算符
  位运算答应你对指定的数据置位或复位。   &:与运算,$a & $b 与 $a和$b都被置位则结果被置位   |:或运算,$a | $b 或 $a或$b有一个被置位则结果被置位   ~:非运算,~ $a 非 $a没有被置位则结果被置位
5、 逻辑运算符
 and:  $a and $b 与 $a和$b同时为真则结果为真  or :  $a or $b 或 $a或$b有一个为真则结果为真  xor:  $a xor $b 异或 $a和$b不同时为真则结果为真  ! :  ! $a 非 $a为假则结果为真  &&:  $a && $b 与 $a和$b同时为真则结果为真  ||:  $a || $b 或 $a或$b有一个为真则结果为真   比较两个变量时,"与"和"或"运算有两种运算符这是以为两种运算符有不同的优先级 6、 比较运算符   比较运算符,就象名字一样,答应你比较两个值。   ==: $a == $b 等于 $a等于$b结果为真   !=: $a != $b 不等于 $a不等于$b结果为真   < : $a < $b 小于 $a小于$结果为真   > : $a > $b 大于 $a大于$b结果为真   <=: $a <= $b 小于等于 $a小于或等于$b结果为真   >=: $a >= $b 大于等于 $a大于或等于$b结果为真

今天配置了新服务器,配置是IIS php,结果运行时发现php连接远程mssql数据库出错,出错代码如下:
Warning: mssql_connect(): Unable to connect to server:

想想以前都是没问题的,怎么回事呢?后来去网上搜索,发现一篇文章,才发现原来服务器是需要安装mssql才能用php连接mssql的,本来新服务器上我是不需要用到mssql的,但是现在没办法了,只能把它装上了,安装了mssql之后就没问题了。

我在想,假如是在linux上面的apache php会怎样呢,不可能需要安装mssql吧,呵呵,晕了。

下面是找到的一篇文章。

php配置:
在php.ini文件里设置如下,找到
;extension=php_mssql.dll 把前面的分号去掉
找到extension_dir = d:extension
你的php.ini里面可能不是d:extension
改成在php安装目录下面的extensions目录下面的php_mssql.dll,所在的路径,假如你没有把它移动到其他地方(假设你的php安装路径是d:php)
就改成extension_dir=d:phpextensions
然后重新启动web服务器


这一点很轻易做到,但是做完这样的设置后还是连不上,错误的信息如下:

MS SQL Server 数据库连接错误!请检查数据库主机变量设置是否正确!!!

而主机的变量设置我是一遍一遍的检查,那些设置是一点问题都没有的,翻遍网页,找到了下面的这点蛛丝马迹:


php.com资料:

I am trying to connect to SQL Server 2000 from PHP
I bumped to following warning:
Warning: mssql_connect(): Unable to connect to server: SERVERPortal
....... on line 5

on line 5 there is:
$db_connect = mssql_connect('SERVERPortal', 'sa', 'my_passwd');

I did the following
1.enabled php_mssql.dll extension in PHP.ini
2.every dll is in proper place(System32 or PHP folder),including ntwdblib.dll

I search lots of profile throught web ,but no one give me proper answer to resolve it.

after a few hour ,I found the problem was caused by
ntwdblib.dll ,which version is 7.00.839 ,when I replaced old ntwdblib.dll with the new

ntwdblib.dll ,which version is 8.00.194 ,all problem are solved.

We had some, read A LOT, of problems with MSSQL under Windows 2003.
We had 2 the same windows, php, php-ini, everything machines but only one could connect.

Unable to connect was the error message.

Finnaly we checked the version of ntwdblib.dll and the one distributed with PHP was 7.00....

and the version of the one on the SQL Server install was 8.00.... so we copied this one in

the php and apache dir and it worked.

问题就这样被找到了,惹祸的是它 ntwdblib.dll

ntwdblib.dll的主要作用是提供sql server连接服务。

我用的php版本是4.3.9,在安装它的服器的 windows/system32/ 下我查到ntwdblib.dll文件的版本是2000.2.8.0 ,这个版本支持的是sql server 7.0, 因为安装PHP时会把dlls下面的所有文件覆盖到系统

目录下,所以当我用它去连接 sql server 2000 的时候当然会是无法连接了。

后来我在一台正常安装sql server 2000 的服务器上查到 ntwdblib.dll的版本是 2000.80.2039.0,我把这个文件拷过去,覆盖掉以前的版本,重启服务器后,一切正常。

补充:假如数据库名的开头是数字时也会提示无法打开,这时要做的很简单,把数据库的名字用中括号 [ ]
括起来就搞定了,如 123bbs 改写成 [123bbs]就没有问题了,另外假如你的数据库名字与sql server中的保留字冲突的话也会出现这种情况,用中括号的方法一样可以解决。
最终,PHP无法正确连接sql server 2000的问题终于解决了,虽然耗费大半天的时间,但收获还是很大的,现在把它贴出来,也让碰到同样问题的兄弟们少走一些弯路。

标签:[!--infotagslink--]

您可能感兴趣的文章: