1

コードレビューのために以下をstackexchangeに投稿しました。しかし、私が求めていることは、SOにとって正当な質問である可能性があることに気付きました. 違うと思ったら教えてください。

複数のフィールドを持つ sql テーブルがあり、そのうちの 4 つは列挙型です。テーブルを考えて実行し、列挙型を取得して 2 次元配列に配置するスクリプトを作成しました。

残念ながら、このスクリプトは非常に遅く、修正できません。

<?php

require_once('mySQL_Connect.php');

$con = ConnectToDataBase();
if ($con == false)
{
    //data returned will be null
    exit;
}

$db = 'courses_db';
$table = 'courses';

$fields = array(
'training_field',
'speciality_field',
'type',
'language');

$enums = array();

foreach ($fields as $colomn) {
$sq1 = "SELECT 
            column_type 
        FROM 
            information_schema.columns 
        WHERE 
            table_schema = '$db' 
        AND 
            table_name = '$table'
        AND 
            column_name = '$colomn'";
$query =  mysqli_query($con,$sq1);

$stack = array();   
$i = 0;
$stack[$i]=$colomn;
if ($fetch = mysqli_fetch_assoc($query) )
{
    $enum = $fetch['column_type'];
    $off = strpos($enum,"(");
    $enum = substr($enum, $off+1, strlen($enum)-$off-2);
    $values = explode(",",$enum);

    // For each value in the array, remove the leading and trailing
    // single quotes, convert two single quotes to one. Put the result
    // back in the array in the same form as CodeCharge needs.

    for( $n = 0; $n < Count($values); $n++) {
    $val = substr( $values[$n], 1,strlen($values[$n])-2);
    $val = str_replace("''","'",$val);
    $stack[$i+1]=$val;
    $i++;
    }
}
    // return the values array to the caller
    //echo json_encode( $stack);
    array_push($enums,$stack);
    reset($stack);
}
echo json_encode($enums);
?> 
4

2 に答える 2

2

私はついに解決策を見つけました、そしてここにそれがあります(これが誰かのために役立つことを願っています):

function get_enum_values($connection, $table, $field )
{

    $query = " SHOW COLUMNS FROM `$table` LIKE '$field' ";
    $result = mysqli_query($connection, $query );
    $row = mysqli_fetch_array($result , MYSQL_NUM );
    #extract the values
    #the values are enclosed in single quotes
    #and separated by commas
    $regex = "/'(.*?)'/";
    preg_match_all( $regex , $row[1], $enum_array );
    $enum_fields = $enum_array[1];

    return( $enum_fields );
}

したがって、基本的にinformation_schemaを実行する必要はありません。

クレジットはこのブログに行きます:

http://akinas.com/pages/en/blog/mysql_enum/

于 2013-03-17T22:16:24.483 に答える