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 = Photograph::find_by_album();」のような別のページでこの関数を使用すると、

次のような SQL エラーが表示されます。「データベース クエリが失敗しました: SQL 構文にエラーがあります。1 行目の「=」付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

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

基本的に、ユーザーが入力した $album_id がデータベースで見つかった Album_id と等しい $table_name からデータベースに保存されているすべての値を取得することです。この問題は簡単だと思うかもしれませんが、残念ながら私は解決策を見つけることができません。アイデアはありますか?前もって感謝します。:)

編集:

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

まず、データベース関数を静的にすることは非常に悪い習慣です。クエリごとに接続または切断し、すべての安全機能を効果的にまったく役に立たなくするからです。たとえば、エラーがスローされると接続が失われ、セッションが終了し、破損した可能性のあるデータがコミットされるため、挿入をロールバックすることはできません。
この回答を投稿した後、ハクレのコメントを読みました。彼は少しぶっきらぼうに見えますが、一理あります。継承と設計パターンについて読みたいと思うかもしれません。

さて、あなたの実際の質問について: 実行しようとしているクエリをダンプしようとしましたか? これを行うと、おそらくクエリが次のようになることがわかります

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 とは見なされません。そのため、メソッドが正しく呼び出されていることを確認してください。もう 1 つの頭痛の原因は、データベース名がないことです。接続でデフォルトのデータベースが選択されていない場合は、次のようにクエリを編集します。

SELECT * FROM yourDb.theTable WHERE album_id = 123

バリエーションでは、未定義の変数エラーが 100% 予想されます。$album_idメソッドの定義から引数を削除しましたが、変数をまったく同じように参照しています。では、どのような値が入力されるのでしょうか? 未定義の変数は、エラーをトリガーするか、暗黙のうちに自身を として宣言します (または宣言されます) null。宣言した static 変数に 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.""); 
}

上記のいずれでも問題が解決しない場合は、find_by_sqlメソッドでデータベース接続を保持しているオブジェクトをダンプしてみてください。接続していない可能性があります。
覚えておいてください: statics はインスタンスを必要とせず、コンストラクターが呼び出されないため、そこで行うことはすべて (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 に答える