2011-07-27 105 views
1

谢谢。我想,让用户登录,我尝试做它在OOP方式关于php类和我的sql问题

这里是loginPage.php

<html> 
<body> 
<?php require_once("connection.php"); 
$instance=new connection("527442_1","chi1234a","foodil_zxq_1"); 
if (isset($_POST['s'])) { 
    $SecIns=new login($_POST['u'],$_POST['p']); 
    echo $SecIns->enter(); 
} 
?> 
<form name="fm" method="POST" action="show.php"> 
User Name :<input type="text" name="u"> 
<br> 
Password: <input type="password" name="p"> 
<br> 
<input type="submit" name="s"> 
</form> 
</body> 
</html> 

这里是OOP代码,我不能Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource

<?php 

class connection 
{var $user; 
var $pass; 
var $db; 

function __construct($user,$pass,$db){ 
$this->user=$user; 
$this->pass=$pass; 
$this->db=$db; 
} 

function conn(){ 
$conn=mysql_connect('localhost' , $this->user , $this->pass) or die ("Can't connect server"); 
mysql_select_db($this->db,$conn) or die ("DB error"); 
} 
} 

class login extends connection 
{ 

function __construct($id,$pwd) 
{$this->id=$id; 
$this->pwd=$pwd; 
} 

function enter() 
{$this->query="SELECT * FROM test WHERE id='".$this->id."' AND pwd='". $this->pwd."';"; 
$result=mysql_query($this->query,$this->conn) or die ("Error:" . mysql_error()); 
if (mysql_num_rows($this->result)<1) 
return "Not correct user"; 
else 
return "Login success"; 
} 
} 
?> 

问题出在function enter()。应该是格式问题?但我花了很长时间。谢谢。

+0

1.'var'并省略可见性修饰符('public','protected','private')是PHP4风格。您应该学习如何在PHP5中编写代码。 2.'mysql'已经过时了一段时间,很快就会被标记为已弃用。您应该使用'MYSQLi'或'PDO'。 3.你不应该直接访问任何'$ _POST'-值而不验证(对于'$ _GET'等)。 – KingCrunch

+0

它仍然不起作用,请在修改后查看我的代码 –

+0

这不是一个答案,那只是一个关于你应该清理什么的评论。你读过下面的答案吗? – KingCrunch

回答

3

虽然这是难能可贵的是要组织添加到您的代码,添加方法到一个类不会自动使OOP。我建议你阅读基础知识,然后重新组织你的课程。

至于你的问题,

$result=mysql_query('$this->query','$this->conn') or die(.. 
--------------------------^ 

你通过被视为文字字符串,因为你已经引述他们这些变量。你需要传递一个实际的查询和一个连接对象。只要删除引号。

另外,我建议你看看参数化查询:http://php.net/manual/en/book.pdo.php

编辑

你的代码进一步看,这些技巧可能会提高你的代码

  • 使用大写的名字你类。这使得它们更易于阅读。
  • 将连接移动到其他课程时是正确的,但是您的使用方法错误。
  • 尽管您已经从Connection类扩展了Login类,但您并未在Login类中实例化一个连接对象,即使您在代码中引用它(例如 - $ this-> conn)
  • 实例化您的连接并将其作为其他类的参数传递。不要从连接中扩展它们。

    $ conn = new Connection($ username,$ pass,$ host,$ db); $ login = new Login($ conn); $ login-> doLogin($ username,$ password);

而且有query()方法在您的连接,这样你就可以调用该方法从其他类。

+0

$ login = new Login($ conn); ??我已经有一个construtor来分配用户输入ID和密码 –

+0

因此,如果我使用$ login = new Login($ conn);如何修改构造函数??谢谢 –

+0

要么有一个方法来设置连接,或将它与其他参数一起传递。无论您选择什么,将其标准化为您的所有课程。 – JohnP

0
$result=mysql_query('$this->query','$this->conn') or die ("Error:" . mysql_error()); 

这段代码不计算为PHP存储变量。如果你单引号的话,PHP不会试图解析它,就好像它是一个变量。删除引号。

执行此操作后,由于没有功能mysql_conn,您的代码将在connection::conn()上失败。有mysql_connect。它以不同的顺序参数(服务器是第一个例子,而不是第三个参数)。

0

尝试:

{$query="SELECT * FROM test WHERE id='".$this->id."' AND '".$this->pwd".';"; 
0

你错过了什么;我写集体所有答案

1 - mysql_conn()是不是你写的function conn() {}
2的功能 - '$result = mysql_query('$this->query','$this->conn')
3去除 - 你已经在mysql中陈述错过一个参数

$query="SELECT * FROM test WHERE id='$this->id' AND  '$this->pwd';"; 
                 ^(here) 

4 - 在$this->query而不是仅分配查询$query

0

您没有将连接对象传递给登录对象,你为什么有这个错误:Warning:mysql_query():提供的参数不是有效的MySQL-Link资源。从登录对象调用$ db的位置开始,您正在使用登录类中的资源而不启动它们......它们在设置它们之前不存在。