Php 如何在使用PDO进行连接后获得正确的列?

Php 如何在使用PDO进行连接后获得正确的列?,php,pdo,Php,Pdo,我有两个MySql表,如下所示: Cat ------ id : INT NOT NULL PRIMARY KEY name : VARCHAR(32) Cheezburger ------- id : INT NOT NULL PRIMARY KEY catId : INT FOREIGN KEY REFERENCES Cat (id) pattyCount : INT $database = new PDO("mysql:host=$hostname;dbname=$dbname", $

我有两个MySql表,如下所示:

Cat
------
id : INT NOT NULL PRIMARY KEY
name : VARCHAR(32)

Cheezburger
-------
id : INT NOT NULL PRIMARY KEY
catId : INT FOREIGN KEY REFERENCES Cat (id)
pattyCount : INT
$database = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $pasword);
$query = $database->prepare('
    SELECT * FROM Cat
    LEFT JOIN Cheezebuger.id ON Cheezburger.catId = cat.id
    WHERE Cat.id = ?');
$query->bindParam(1, $someId);
$query->execute();
$cat = $query-fetch();
当我使用PHP的PDO对两个表执行
左连接时,我会执行以下操作:

Cat
------
id : INT NOT NULL PRIMARY KEY
name : VARCHAR(32)

Cheezburger
-------
id : INT NOT NULL PRIMARY KEY
catId : INT FOREIGN KEY REFERENCES Cat (id)
pattyCount : INT
$database = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $pasword);
$query = $database->prepare('
    SELECT * FROM Cat
    LEFT JOIN Cheezebuger.id ON Cheezburger.catId = cat.id
    WHERE Cat.id = ?');
$query->bindParam(1, $someId);
$query->execute();
$cat = $query-fetch();

我的问题是,如何区分与
Cat
表关联的
id
字段和与
Cheezburger
表关联的
id
$cat['id']
正在给我
Cheezburger
id
字段。

避免使用“惰性”
*
并明确指定所需字段:

SELECT cat.ID AS catID, Cheezeburger.id AS icanhaz ...

避免使用“lazy”
*
,并明确指定所需的字段:

SELECT cat.ID AS catID, Cheezeburger.id AS icanhaz ...

您需要枚举字段,并将它们列出,这样

SELECT cat.id as catId, cat.name, cheezburger.id as cheezId ...

您需要枚举字段,并将它们列出,这样

SELECT cat.id as catId, cat.name, cheezburger.id as cheezId ...

选择*
通常是不可取的。相反,请明确说明所需的列,并为类似的命名列指定别名:

SELECT
  Cat.id AS catid,
  Cat.name AS name,
  Cheezeburger.id AS chzid,
  ...
FROM 
  Cat LEFT JOIN Cheezebuger.id ON Cheezburger.catId = cat.id
WHERE Cat.id = ?
现在,要检索
Cat.id
,请使用
$Cat['catid']
;要检索
cheezburger.id
,请使用
$Cat['chzid']

反对执行
SELECT*
的一个重要原因是,如果您以后添加了应用程序此特定部分中不需要的更多列,则不会使用数据库服务器上的额外内存来检索不需要的数据并将其提取到不使用的web应用程序中。如果您后来碰巧添加了一个二进制BLOB列,则可能会不必要地提取更多的数据


另一个原因是你发现的。您可能会在列名中引起歧义。

通常不建议
选择*
。相反,请明确说明所需的列,并为类似的命名列指定别名:

SELECT
  Cat.id AS catid,
  Cat.name AS name,
  Cheezeburger.id AS chzid,
  ...
FROM 
  Cat LEFT JOIN Cheezebuger.id ON Cheezburger.catId = cat.id
WHERE Cat.id = ?
现在,要检索
Cat.id
,请使用
$Cat['catid']
;要检索
cheezburger.id
,请使用
$Cat['chzid']

反对执行
SELECT*
的一个重要原因是,如果您以后添加了应用程序此特定部分中不需要的更多列,则不会使用数据库服务器上的额外内存来检索不需要的数据并将其提取到不使用的web应用程序中。如果您后来碰巧添加了一个二进制BLOB列,则可能会不必要地提取更多的数据


另一个原因是你发现的。您可以在列名中引入歧义。

谢谢!我知道这可能很简单,只是对PHP和SQL还是很陌生。谢谢!我知道这可能很简单,只是对PHP和SQL来说还很陌生。