使用 PHP/PDO/MySQL 是否可以在对多个表进行选择时对列使用通配符,并且返回的数组键是完全限定的,以避免列名冲突?
示例:
SELECT * from table1, table2;
给出:
数组键是'table1.id'、'table2.id'、'table1.name'等
我尝试了“SELECT table1.*,table2.* ...”,但返回的数组键不是完全限定的,因此具有相同名称的列发生冲突并被覆盖。
最佳答案
是的,你可以。最简单的方法是使用 pdo,尽管至少有一些其他扩展能够做到这一点。
pdo
在 PDO 上设置属性对象,而不是 PDOStatment .
$PDO->setAttribute(PDO::ATTR_FETCH_TABLE_NAMES, true);
就是这样。然后你会得到像 $row['myTable.myColumn']
这样的关联数组键。如果您也获取对象(例如通过 PDO::FETCH_OBJECT
),它会起作用,所以要小心,因为您需要访问 $obj->{'myTable.myColumn'} 之类的属性
*manual says PDO::ATTR_FETCH_TABLE_NAMES
属性仅受某些驱动程序支持。如果上述方法不起作用,可能会起作用。
$pdoStatement->setFetchMode(PDO::FETCH_NUM);
$pdoStatement->execute();
//build our associative array keys
$qualifiedColumnNames = array();
for ($i = 0; $i < $pdoStatement->columnCount(); $i++) {
$columnMeta = $pdoStatement->getColumnMeta($i);
$qualifiedColumnNames[] = "$columnMeta[table].$columnMeta[name]";
}
//fetch results and combine with keys
while ($row = $pdoStatement->fetch()) {
$qualifiedRow = array_combine($qualifiedColumnNames, $row);
print_r($qualifiedRow);
}
相同的基本模式用于其他数据库扩展
mysql
$res = mysql_query($sql);
//build our associative array keys
$qualifiedColumnNames = array();
for ($i = 0; $i < mysql_num_fields($res); $i++) {
$columnMeta = mysql_fetch_field($res, $i);
$qualifiedColumnNames[] = "$columnMeta[table].$columnMeta[name]";
}
//fetch results and combine with keys
while ($row = mysql_fetch_row($res)) {
$qualifiedRow = array_combine($qualifiedColumnNames, $row);
print_r($qualifiedRow);
}
mysqli
$res = $mysqli->query($sql);
//build our associative array keys
$qualifiedColumnNames = array();
foreach ($res->fetch_fields() as $columnMeta) {
$qualifiedColumnNames[] = "{$columnMeta->table}.{$columnMeta->name}";
}
//fetch results and combine with keys
while ($row = $res->fetch_row()) {
$qualifiedRow = array_combine($qualifiedColumnNames, $row);
print_r($qualifiedRow);
}
这也适用于表别名(在 php 7.1 中测试)——限定的列名将使用表别名。
关于php - SQL 从多个表中选择 *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2523631/