3

現在、mysql/php を使用してフォームを作成しようとしています。以下は、これまでのコードの一部です。

ブロック#1:

$proceso = mysqli_fetch_assoc($result); // my query returns only one row

...

<form action='actualizar.php' method='Post'>
<?php
foreach(array_keys($proceso) as $key){

echo "<label for='$key'>$key: </label>";
echo "<input name='$key' value='".$proceso[$key]."'><br/>";

}
echo "<input type='hidden' name='View' value='$view'>";
?>

<input type="submit" value="Actualizar">
</form>

これまでのところ、フィールド名を使用してラベルを生成し、フィールド値を表示する入力ボックスを作成するフォームを取得しています。jquery datepicker を使用していくつかのフィールドをさらにフォーマットしたいと思いますが、mysql テーブルで type = Date を持つフィールドに対してのみです。

私はmysqli_fetch_field_direct次のようなものを使用しようとしています:

ブロック#2:

$fields = mysqli_num_fields($result);
for ($i=0; $i < $fields; $i++) {
    $field_types[] = $result->fetch_field_direct($i)->type;
}

ただし、この場合、値を取得できず、型だけを取得できます

フィールドの型と値を取得する簡単な方法はありますか?

単純化するために(試して)編集しました:

email= というタイプのフィールドがvarcharあり、SQL クエリが 1 つの結果を生成するとします。test@example.com

BLOCK#1 から私は得る:

     -------------------------------
     Field-Name  | Field-Value
     email       | test@example.com

BLOCK#2 から、次のようになります。

     -------------------------------
     Field-Name | Field-Type
     email      | varchar

私が手に入れたいのは

     -------------------------------
     Field-Name | Field-Type | Field-Value
     email      | varchar    | test@example.com

これは、フィールド タイプを使用して入力ボックスに css クラスを追加したい (datepicker を使用するなど) ためです。

4

1 に答える 1

7

編集: 眠れないので、出力をテーブルに入れました...

わかりました...これがあなたが望むものかどうか見てください...

これは、別の SO の質問に対して作成した表です。

mysql> describe user;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| User_ID     | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| Email       | varchar(100)     | YES  |     | NULL    |                |
| Name        | varchar(100)     | YES  |     | NULL    |                |
| Password    | varchar(100)     | YES  |     | NULL    |                |
| FB_ID       | int(11)          | YES  |     | NULL    |                |
| Total_Score | int(11)          | YES  |     | 0       |                |
| add_date    | datetime         | YES  |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

そしてDBから:

mysql> select * from user limit 1;
+---------+-------+------+----------+-------+-------------+---------------------+
| User_ID | Email | Name | Password | FB_ID | Total_Score | add_date            |
+---------+-------+------+----------+-------+-------------+---------------------+ 
|       1 | NULL  | kim  | NULL     |  NULL |          10 | 2013-11-03 23:04:08 |
+---------+-------+------+----------+-------+-------------+---------------------+
+
1 row in set (0.00 sec)

そしてコード:

<?php
$mysqli = mysqli_connect("localhost", "root", "", "test");

// this came from http://php.net/manual/en/mysqli-result.fetch-field-direct.php 
$mysql_data_type_hash = array(
    1=>'tinyint',
    2=>'smallint',
    3=>'int',
    4=>'float',
    5=>'double',
    7=>'timestamp',
    8=>'bigint',
    9=>'mediumint',
    10=>'date',
    11=>'time',
    12=>'datetime',
    13=>'year',
    16=>'bit',
    //252 is currently mapped to all text and blob types (MySQL 5.0.51a)
    253=>'varchar',
    254=>'char',
    246=>'decimal'
);

// run the query... 
$result = $mysqli->query("select * from user limit 1"); 

// get one row of data from the query results 
$proceso = mysqli_fetch_assoc($result);

print "<table>
        <tr>
           <th>\$key</th>
           <th>\$value</th>
           <th>\$datatype</th>
           <th>\$dt_str</th>
        </tr>  ";

// to count columns for fetch_field_direct()
$count = 0; 

// foreach column in that row...
foreach ($proceso as $key => $value) 
{
  $datatype = $result->fetch_field_direct($count)->type;  
  $dt_str   = $mysql_data_type_hash[$datatype];
  $value    = (empty($value)) ? 'null' : $value;  

  print "<tr>
           <td>$key</td>
           <td>$value</td>
           <td class='right'>$datatype</td>
           <td>$dt_str</td>
         </tr>  ";  
  $count++; 
} 

print "</table>"; 

mysqli_close($mysqli);
?> 

<style>
   /* this is css that you don't need but i was bored so i made it pretty...! */
   table   { font-family:Courier New; 
             border-color:#E5E8E3; border-style:solid; border-weight:1px; border-collapse:collapse;}
   td,th   { padding-left:5px; padding-right:5px; margin-right:20px; 
             border-color:#E5E8E3; border-style:solid; border-weight:1px; }
   .right  { text-align:right }
</style>

だから...明確にするために...

その中でこれらの変数をforeach使用して、必要に応じて情報を出力または使用できます: (例として、user_id の出力の最初の行を使用しています)

  • $keyは列/フィールド名です (などuser_id)

  • $field_types[$key]から来る$result->fetch_field_direct($i)->type(など3

  • $mysql_data_type_hash[$datatype]$mysql_data_type_hashコードの先頭にある配列を使用したデータ型の文字列バージョンです。これは必須ではありませんが、この例がより明確になるように含めました。(などint)

  • $proceso[$key] = $value =foreach ステートメントのこの反復に対する値 ( など1)

出力:

$key           $value          $datatype      $dt_str
User_ID        1                       3      int
Email          null                  253      varchar
Name           kim                   253      varchar
Password       null                  253      varchar
FB_ID          null                    3      int
Total_Score    10                      3      int
add_date       2013-11-03 23:04:08    12      datetime
于 2013-11-04T04:49:45.737 に答える