0

这是我的代码:

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

编辑:

跟随 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

还有其他想法吗?

4

3 回答 3

3

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

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

SELECT * FROM photographsWHERE album_id = NULL

修复:在 WHERE 之前添加一个空格,并删除self::from 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,并且 - 当然 - 将其初始化为一个有意义的值。

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.""); 
}

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

于 2012-08-06T10:26:09.590 回答
0

缺少一个空间?

return self::find_by_sql("SELECT * FROM ".self::$table_name." WHERE album_id = ".self::$album_id."");
于 2012-08-06T10:20:42.780 回答
0

使用 intval() 或 mysql_real_escape_string() 添加一个空格并为专辑 ID 引入一些安全性

return self::find_by_sql("SELECT * FROM `".self::$table_name."` WHERE `album_id` = ".self::$album_id);
于 2012-08-06T10:21:25.323 回答