在PHP中访问对象,静态变量

时间:2012-08-06 10:16:08

标签: php

这是我的代码:

class Photograph extends DatabaseObject {

    protected static $table_name="photographs";
    protected static $db_fields=array('id', 'filename', 'type', 'size', 'caption','album_id');
    public $id;
    public $filename;
    public $type;
    public $size;
    public $caption;
    //public $album_id;
    protected static $album_id;

    private $temp_path;
    protected $upload_dir="images";

现在,当我在另一页上使用此功能时,例如'$ photos = Photograph :: find_by_album();'

我收到一条sql错误,指出:'数据库查询失败:您的SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行<= p>附近的'='附近使用正确的语法

public static function find_by_album($album_id='') 
{
return self::find_by_sql("SELECT * FROM ".self::$table_name."WHERE album_id = ".self::$album_id."");
}

基本上,我要做的是从$ table_name中获取保存在数据库中的所有值,其中用户输入的$ album_id等同于数据库中找到的album_id。您可能会发现此问题很简单,但遗憾的是,我无法找到解决方案。有什么想法吗?提前致谢。 :)

编辑:

继Elias Ootegem先生之后,

我修改了代码,现在看起来像

public static function find_by_album($album_id='') 
{ return self::find_by_sql("SELECT * FROM ".self::$table_name." WHERE album_id = ".$album_id.""); 
}

但是,我仍然得到同样的错误。我尝试使用此代码:

public static function find_by_album() 
{ return self::find_by_sql("SELECT * FROM ".self::$table_name." WHERE album_id = ".$album_id.""); 
} 

现在又出现了另一个错误:未定义的变量:album_id

还有其他想法吗?

3 个答案:

答案 0 :(得分:3)

首先,将数据库函数设置为静态非常糟糕,因为您要为每个查询连接和断开连接,并且有效地使所有安全功能完全无用。例如,您不能回滚插入,因为一旦抛出错误,连接就会丢失,终止会话并提交可能已损坏的数据。发表这个答案后,我读了hakre的评论。虽然他有点生硬,但他确实有一点意义。您可能想要了解继承和设计模式,这可能会让您轻松掌握静态

现在,对于您的实际问题:您是否尝试过转储您尝试执行的查询?如果你这样做,你可能会看到你的查询看起来像

SELECT * FROM photographsWHERE album_id = NULL

修复:在WHERE之前添加一个空格,然后从self::中删除self::$album_id。在我收集时,您希望使用传递给该方法的参数。此参数可能与静态属性具有相同的名称,但默认情况下不会将其分配给它。


响应您的更新:

public static function find_by_album($album_id='') 
{
    return self::find_by_sql("SELECT * FROM ".self::$table_name." WHERE album_id = ".$album_id.""); 
}

这个方法可以工作,前提是你这样称呼它:

Photograph::find_by_album(123);//or some variable that holds a valid id

如果您未能将参数传递给此方法,它将回退到默认值,即空字符串。结果是如下查询:

SELECT * FROM photographs WHERE album_id = 

由于显而易见的原因,这不会被视为有效的SQL。因此,请确保正确调用该方法。另一件可能导致您头痛的原因是缺少数据库名称。如果您的连接没有选择默认数据库,请按如下方式编辑查询:

SELECT * FROM yourDb.theTable WHERE album_id = 123

在变体上,未定义的变量错误是预期的100%,您已从方法的定义中删除了$album_id参数,但您引用的变量完全相同。那么什么价值被填补?未定义的变量将触发错误或以null静默声明自身(或声明)。如果您希望PHP回退到您声明的静态变量(但未在您的代码段中初始化),则需要将范围指定为self::$album_id,并且 - 当然 - 将其初始化为一个值SENCE。

public static function find_by_album() 
{
    self::$album_id = (self::$album_id ? self::$album_id : 1);//if is set use the value, else use 1
    return self::find_by_sql("SELECT * FROM ".self::$table_name." WHERE album_id = ".self::$album_id.""); 
}

如果以上都不能解决您的问题,请尝试在find_by_sql方法中转储保存数据库连接的任何对象。有可能你没有建立联系。
记住:静态不需要实例,你的构造函数不会被调用,所以你在那里做的一切(在db对象中,一般来说,连接到数据库)都得到执行。

答案 1 :(得分:0)

缺少单一空间?

return self::find_by_sql("SELECT * FROM ".self::$table_name." WHERE album_id = ".self::$album_id."");

答案 2 :(得分:0)

使用intval()或mysql_real_escape_string()

添加空格并为相册ID引入一些安全性
return self::find_by_sql("SELECT * FROM `".self::$table_name."` WHERE `album_id` = ".self::$album_id);