2

ここに私の配列があります:

protected static $db_fields = array('id', 'username', 'password');

これが私がそれをどのように使用するかです:

protected function attributes(){
    $attributes = array();
    foreach(static::$db_fields as $field){
        $attributes[$field] = $this->$field;
    }
    return $attributes;
}

属性の使用方法は次のとおりです。

protected function create(){
    global $database;
    $attributes = $this->sanitized_attributes();

    $sql = "INSERT INTO " . static::$table_name . " (";
    $sql .= join(", ", array_keys($attributes));
    $sql .= ") VALUES ('";
    $sql .= join("', '", array_values($attributes));
    $sql .= "')";

    if($database->query($sql)){
        $this->id = $database->inserted_id();
        return TRUE;
    }else{
        return FALSE;
    }
}

私がする必要があるのは、データベースからその db_fields 配列を直接生成し、私が行ったように手動で割り当てることだけです。「SHOW COLUMNS FROM」テーブル名で遊んでみましたが、うまくいきませんでした。

列を表示:

function attributes(){
    global $database;
    $attributes = array();
    $sql = "SHOW COLUMNS FROM " . static::$table_name;
    $result = $database->query($sql);
    $db_fields = mysql_fetch_assoc($result);

    for($i = 0; $i < mysql_num_rows($result); $i++){
        while ($db_fields = mysql_fetch_assoc($result)) {
          $attributes[] = $db_fields['Field'];
        }
    }

    return $attributes;
}

私の最終的なアプローチは、次のような配列にする必要があります。

$db_fields = ('column1_name', 'column2_name', 'column3_name') 

私の現在の「SHOW COLUMNS」プレイアラウンドの結果は、列の名前と同じように、username: username、password: password ... の値を作成することです。

これらの列名を配列に割り当てる方法が問題だと思います。では、そのような配列を作成するための正しいクエリは何でしょうか?

最終的に私はそれを解決しました:

protected static $db_fields;

function __construct(){
    self::generate_attributes();
}

protected static function generate_attributes(){
    $sql = "SHOW COLUMNS FROM admins";
    $result = mysql_query($sql);
    $rows = mysql_fetch_assoc($result);

    for($i = 0; $i < mysql_num_rows($result); $i++){
        while ($rows = mysql_fetch_assoc($result)) {
          self::$db_fields[] = $rows['Field'];
        }
    }
    return self::$db_fields;
}
protected function attributes(){
    $attributes = array();
    foreach(static::$db_fields as $field){
        $attributes[$field] = $this->$field;
    }
    return $attributes;
}

助けてくれてありがとう。

4

4 に答える 4

1

試してみてはどうですか

SELECT `column_name` FROM `information_schema`.COLUMNS WHERE TABLE_NAME = 'yourtable';

db ユーザーには、information_schema に対する読み取りアクセスが必要です。

必要に応じて、GROUP_CONCAT を使用してカンマ区切りの文字列を作成することもできます。

SELECT GROUP_CONCAT(c.column_name) FROM `information_schema`.COLUMNS c WHERE TABLE_NAME = 'yourtable';
于 2013-03-14T05:07:59.843 に答える
0
$query = "SELECT * from myTable LIMIT 1";
if ($result = mysqli_query($link, $query)) {
$finfo = mysqli_fetch_fields($result);

foreach ($finfo as $val) {
   print_r($val);
}
mysqli_free_result($result);
}
于 2013-03-14T05:05:59.643 に答える
0

これらを試して、テーブル名とスキーマを使用して、列に関するすべての詳細を取得してください。

SELECT `column_name`  FROM `information_schema`.COLUMNS WHERE TABLE_NAME = 'table_name' AND TABLE_SCHEMA = 'database_name'

*代わりに使用できますcolumn_name

知っておくべきことがたくさんある inaformation_schema テーブルを確認してください

于 2013-03-14T06:19:17.870 に答える
0

これを試して:

function attributes(){
    global $database;
    $attributes = array();
    $sql = "SELECT column1_name,column2_name,column3_name FROM " . static::$table_name;//your columns
    $result = $database->query($sql);
    $db_fields = array('column1_name', 'column2_name', 'column3_name') ;
    $i=0;
    if(mysql_num_rows($result)){
        while ($rows = mysql_fetch_row($result)) {
           for($j=0;$j<count($db_fields);$j++)
           {
               $attributes[$i][$db_fields[$j]] = $rows[$j] ;
           }
           $i++;
        }
    }
    return $attributes;
}
于 2013-03-14T05:32:31.567 に答える