2010-04-12 10 views

ответ

3

Вы можете получить возможные значения для поля SET с помощью DESCRIBE myTableName mySetColumn или SHOW COLUMNS FROM myTableName LIKE mySetColumn:

mysql> DESCRIBE myTableName mySetColumn; 
    +-------+-------------------------------------------+------+-----+---------+-------+ 
    | Field | Type          | Null | Key | Default | Extra | 
    +-------+-------------------------------------------+------+-----+---------+-------+ 
    | myset | set('Travel','Sports','Dancing','Dining') | YES |  | NULL |  | 
    +-------+-------------------------------------------+------+-----+---------+-------+ 

информативная статья here, ручной here.

2
SELECT `COLUMN_TYPE` FROM `information_schema`.`COLUMNS` 
WHERE `TABLE_SCHEMA` = 'my_database_name' 
    AND `TABLE_NAME` = 'my_table_name' 
    AND `COLUMN_NAME` = 'my_set_column'; 

дает вам только тип, например.

set('Travel','Sports','Dancing','Dining') 

вам все равно придется извлекать заданное значение на текстовой основе, но есть меньше беспорядка вокруг него таким образом.

+0

Я думаю, что это лучший ответ здесь, потому что он единственный, который будет работать как часть большего запроса и не требует внешних скриптов. – Synchro

2

Полная реализация от @ ссылки Энди к документации:

/** 
* @return array 
* @param table DB table 
* @param column Column name 
* @desc Return an array of the possible values for a SET 
*/ 
function get_set($table,$column) 
{ 
    $sql = "SHOW COLUMNS FROM $table LIKE '$column'"; 
    if (!($ret = mysql_query($sql))) 
     die("Error: Could not show columns"); 

    $line = mysql_fetch_assoc($ret); 
    $set = $line['Type']; 
    // Remove "set(" at start and ");" at end. 
    $set = substr($set,5,strlen($set)-7); 
    // Split into an array. 
    return preg_split("/','/",$set); 
} 
0

Вот как получить возможные значения SET с помощью расширения PDO.

function get_set($table, $column) 
{ 

    global $db; //PDO DB Handler 

    $sql = "SHOW COLUMNS FROM $table LIKE :column"; 
    $stmt = $db -> prepare($sql); 

    $stmt -> bindParam(":column", $column, PDO::PARAM_STR, 50); 

    try { 
     $result = $stmt -> execute(); 
     $row = $stmt -> fetch(PDO::FETCH_ASSOC); 
     $set = $row['Type']; 
     $set = substr($set,5,strlen($set)-7); 
     // Split into an array. 
     return preg_split("/','/",$set); 
    } catch (PDOException $e) { 
     echo $e -> getMessage(); 
     return false; 
    } 

} 

[Source]

+0

Зачем связывать '$ column', а не' $ table'? Не может ли он содержать инъекции? – Erk

+0

@ Ерк, конечно, может. Если имя таблицы принимается как пользовательский ввод, пожалуйста, сделайте это. Иначе это не та информация, которая требует ввода пользователя. – Starx

0

Приведенные выше методы не были точно работает для меня, но я закончил с этим и он прекрасно работает. Проводка в случае, если это поможет кому-либо еще в той же ситуации. Вам просто нужно обрезать строку на основе ваших результатов, так как она будет содержать имя вашего столбца вместе с словом «set».

<?php> 
    include ('database.php'); 
    $query = "SHOW COLUMNS FROM Products LIKE 'Genre'"; 

    $stmt = $con->prepare($query); 

    $result = $stmt -> execute(); 
    if ($result) { 
    $row = $stmt -> fetch(PDO::FETCH_ASSOC); 
     $genres = implode($row); 

     $genres = substr($genres,10,strlen($genres)-14); 
     //echo $genres; 
     $genres = preg_split("/','/",$genres); 

    //this is to populate my select box options with set values 
     echo "<select name = 'genre'>"; 
     echo "<option>Select...</option>"; 
     foreach ($genres as $key=>$value) { 
      echo "<option name = '$value' value = '$value'>$value</option>"; 
     }; 
     echo "</select>"; 
    } 


    ?> 
Смежные вопросы