这是我的代码:
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
还有其他想法吗?
答案 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);