【问题标题】:How to fetch field type and value?如何获取字段类型和值?
【发布时间】:2013-11-04 04:40:10
【问题描述】:

我目前正在尝试使用 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 查询生成一个结果 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类(比如使用日期选择器)。

【问题讨论】:

  • 我很困惑...$proceso[$key] 不是价值吗?
  • 是的,在第一个代码块中,我得到的是值而不是类型,而在第二个代码块中,我得到的是类型,而不是值。我很难将第一个块与使用 mysqli_fetch_field_direct 混合在一起,我想知道如何才能同时获得两者,以便在更简单的过程中获得类似:echo "&lt;input name='$key' class='$type' value='".$proceso[$key]."'&gt;&lt;br/&gt;"; 的内容。
  • 我在下面发布了一些内容...我不确定这是否正是您想要的。告诉我,如果你需要我可以修改它。
  • 如果该答案适合您,请检查是否已回答。如果它不适合您,请告诉我,我会尽力为您解决。

标签: php mysql


【解决方案1】:

编辑:我把输出放在一个表格中,因为我睡不着......

好的……看看这是不是你想要的……

这是我为另一个 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)

来自数据库:

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-&gt;fetch_field_direct($i)-&gt;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

【讨论】:

  • 谢谢,但我想要得到类似这样的输出 Email: varchar test@example.com Name: varchar Tess 这是考虑到我的查询正在生成单行。
  • 只需将这一行更改为print $proceso[$key].": $str &lt;br/&gt;";,那将是data: datatype...?我以为你可以自己弄清楚你想要格式化输出的方式,因为我不知道确切......
  • 哦,有道理,我明天试试,让你知道。感谢您的宝贵时间。
  • 非常感谢您发布这个 - 我一直在寻找这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2014-12-17
  • 2011-05-27
  • 1970-01-01
相关资源
最近更新 更多