2012-08-06 95 views
0

这里是我的代码:访问对象,在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"; 

现在,当我使用下面这个函数在另一页上,如“$照片=照片:: find_by_album();”

我得到一个sql错误,说:'数据库查询失败:你的SQL语法有错误;检查对应于你的MySQL服务器版本在线路附近使用“=” 1'

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。您可能会发现这个问题很简单,但不幸的是,我无法找到解决方案。请有任何想法吗?提前致谢。 :)

编辑:

继埃利亚斯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

任何其他的想法?

+1

在表名后面放一个空格SELECT * FROM photographsWHERE album_id = – Waygood 2012-08-06 10:19:02

+3

输出SQL查询的样子,不仅仅是错误消息。然后,你可以真正了解什么是错的(和其他人)。你也在滥用静态的极端,所以我对你的感受有点有限。你应该首先了解继承,而不是静态函数堆栈(或者如果你非常喜欢静态的话,可以使用['Super :: $ tatic'](http://i.imgur.com/RJEsz.png)来提供数据库) 。 – hakre 2012-08-06 10:21:41

回答

0

缺乏单一空间?

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

添加一个空格,并介绍一些secuity到相册ID与INTVAL()或mysql_real_escape_string()

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

首先,这是非常不好的做法,让您的数据库功能,静态的,因为你”将为每个查询连接和断开连接,并且您将有效渲染所有安全功能完全无用。例如,您不能回滚插入,因为一旦发生错误,连接就会丢失,终止会话并提交可能损坏的数据。
发布这个答复之后,我阅读了hakre的评论。虽然他有点生硬,但他确实有一点。您可能需要了解继承和设计模式,这可能会让您放松静态

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

SELECT * FROM photographsWHERE album_id = NULL 

修复:WHERE前添加一个空格,并从self::$album_id删除self::。在我收集的时候,你想使用传递给方法的参数。该参数可能与静态属性具有相同的名称,但默认情况下未将其分配给它。


在回答您的更新:

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,并且 - 当然 - 将其初始化为一个可以使用的值。

​​

如果没有上述解决您的问题,尝试倾销任何对象持有find_by_sql方法的数据库连接。有可能你没有建立联系。
记住:statics不需要实例,你的构造函数没有被调用,所以你在那里做的所有事情(在db对象中,一般来说,连接到数据库)NOT得到执行。

+0

我修改了代码,它现在看起来像 public static function find_by_album($ album_id ='') { return self :: find_by_sql(“SELECT * FROM”.self :: $ table_name。“WHERE album_id =”。 $ album_id “”)。 } 但是,我仍然得到相同的错误。 我尝试使用此代码: 公共静态功能find_by_album(){ 回报 自我::的find_by_sql( “SELECT * FROM” .self :: $表格名 “WHERE album_id =” $ album_id “”。) } 现在另一个错误出现它说: 未定义的变量:album_id 任何想法 – user1242749 2012-08-06 11:52:21

+0

后者很容易,你已删除了参数,所以没有所谓的变量'$ album_id'了,因此错误'未定义变量“。在第一种情况下,您应该检查'$ album_id'是否有实际值:将其设置为默认值1或者其他值,如果没有值传递,结果查询将是'SELECT * FROM photographsWHERE album_id =',这是语法错误,这可以解释第一个问题。 'var_dump'或'echo'查询字符串,并在可能的情况下将其发布到此处 – 2012-08-06 12:39:53