为了验证用户输入表单的数据的完整性,我必须执行的一项测试是确保数据不超过保存它的表列的长度。我没有硬编码表中各列的最大长度值,而是认为编写一个从我的表中收集所有相关约束信息的例程(这里只是data_type和character_maximum_length)和将它放入一个关联数组中,我可以在其中简单地检索具有易写和可读性的值:
$table_info_array[$table_name][$column_name]['character_maximum_length'];
我找到了一个解决方案,它在我的localhost上运行得很快,但$ table_info_array的构建在我的实时服务器上速度慢得令人无法接受。这是我编码的内容:
/* Skipped here: set up your PDO $connection first, then: */
// Define your database:
$database_name = "my_database";
$sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '" . $database_name ."'";
$stmt = $connection->prepare($sql);
$result = $stmt->execute();
$counter = -1;
$table_array = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
foreach ($row as &$value) {
$counter++;
$table_array[$value] = $counter;
}
}
$table_info_array = array();
foreach ($table_array as $table_name => $table_value) {
// Here I'm selecting the data_type and character_maximum_length by column_name, but other information could easily be collected:
$sql = "SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = '" . $table_name . "'";
$stmt = $connection->prepare($sql);
$result = $stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
$table_info_array[$table_name][$row['column_name']]['data_type'] = $row['data_type'];
$table_info_array[$table_name][$row['column_name']]['character_maximum_length'] = $row['character_maximum_length'];
}
}
这将显示一切;请注意结果的简洁性:
print_r($table_info_array);
因此,检索表列约束的语法是:
$table_info_array[$table_name][$column_name]['data_type'];
$table_info_array[$table_name][$column_name]['character_maximum_length'];
例如,现在我可以在'artwork'表格的'title'列中检索最大字符长度,如下所示:
$table_info_array['artwork']['title']['character_maximum_length'];
$ table_info_array的构造在我的本地主机上以闪电般的速度运行,但在我的实时服务器上它的速度非常慢。有更快的方法吗?