【问题标题】:About php classes and my sql problem关于php类和我的sql问题
【发布时间】:2011-07-27 09:42:41
【问题描述】:

谢谢。我想让用户登录,我尝试以 oop 方式进行

这里是 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()。应该是格式问题吧??但我花了很长时间。谢谢。

【问题讨论】:

  • 1. var 并省略可见性修饰符(publicprotectedprivate)是 PHP4 风格的。您应该学习如何用 PHP5 编写代码。 2. mysql 已经过时了一段时间,很快就会被标记为弃用。您应该改用MYSQLiPDO。 3. 你应该永远在没有验证的情况下直接访问任何$_POST-value($_GET 等也是如此)。
  • 还是不行,修改后请看我的代码
  • 这不是一个答案,这只是一个关于你应该清理什么的评论。您阅读下面的答案了吗?

标签: php mysql


【解决方案1】:

虽然您希望将组织添加到代码中是值得称赞的,但将方法添加到类中并不会自动使其成为 OOP。我建议您阅读基础知识,然后重新组织您的课程。

至于你的问题,

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

您传递的那些变量被视为文字字符串,因为您已经引用了它们。您需要将实际查询和连接对象传递给它。只需删除引号。

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

编辑

进一步查看您的代码,这些提示可能会改进您的代码

  • 为您的类使用大写名称。这使它们更易于阅读。
  • 您将连接移至其他类是正确的,但您的用法是错误的。
  • 即使您已经从 Connection 类扩展了 Login 类,即使您在代码中引用了连接对象(例如 - $this->conn),也不会在 Login 类中实例化连接对象以供使用/li>
  • 实例化您的连接并将其作为参数传递给您的其他类。不要从连接中扩展它们。

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

并且在您的连接中有一个query() 方法,因此您可以从其他类中调用该方法。

【讨论】:

  • $login = new Login($conn); ??我已经有一个构造器来分配用户输入 id 和密码
  • 所以,如果我使用 $login = new Login($conn);如何修改构造函数??谢谢
  • 要么有设置连接的方法,要么与其他参数一起传入。无论您选择什么,都要为您的所有课程标准化。
  • 对不起,我不明白。如何传递连接字符串?
  • 准确的说是LOGIN类怎么修改??
【解决方案2】:
$result=mysql_query('$this->query','$this->conn') or die ("Error:" . mysql_error());

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

执行此操作后,您的代码将在 connection::conn() 处失败,因为没有函数 mysql_conn。有mysql_connect。它以不同的顺序接受参数(例如,服务器是第一个参数,而不是第三个参数)。

【讨论】:

    【解决方案3】:

    试试:

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

    【讨论】:

      【解决方案4】:

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

      1 - mysql_conn() 不是您在 function conn() {} 中编写的函数
      2 - 从 $result = mysql_query('$this-&gt;query','$this-&gt;conn') 中删除 '
      3 - 你在mysql语句中漏掉了一个参数

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

      4 - 在$this-&gt;query 中分配查询,而不仅仅是$query

      【讨论】:

        【解决方案5】:

        您没有将连接对象传递给登录对象,这就是您出现此错误的原因:警告:mysql_query():提供的参数不是有效的 MySQL-Link 资源。从登录对象调用 $db 的位置,您正在使用登录类中的资源而不启动它们......它们在您设置它们之前不存在。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-27
          • 1970-01-01
          • 1970-01-01
          • 2015-01-12
          • 2011-10-29
          • 1970-01-01
          相关资源
          最近更新 更多