Php MYSQL字段ID值正在更改
数据库: 列表Php MYSQL字段ID值正在更改,php,mysql,pdo,mysqli,Php,Mysql,Pdo,Mysqli,数据库: 列表 | ID | TITLE | COMPANY_ID | | 1 | One | 1 | | 2 | One | 1 | | 3 | One | 1 | 公司 | ID | NAME | | 1 | One | | 2 | Two | | 3 | Three | 我有PDO MYSQL语句: "SELECT listi
| ID | TITLE | COMPANY_ID |
| 1 | One | 1 |
| 2 | One | 1 |
| 3 | One | 1 |
公司
| ID | NAME |
| 1 | One |
| 2 | Two |
| 3 | Three |
我有PDO MYSQL语句:
"SELECT
listings.ID,
listings.TITLE,
listings.COMPANY_ID,
companies.ID,
companies.NAME
FROM listings INNER JOIN companies ON (listings.COMPANY_ID = companies.ID ) WHERE (listings.TITLE = :p1 AND companies.NAME = :p2 )LIMIT 10"
关联数组输出:
Array
(
[ID] => 1
[TITLE] => analyst
[COMPANY_ID] => 1
[NAME] => one
)
Array
(
[ID] => 1
[TITLE] => analyst
[COMPANY_ID] => 1
[NAME] => one
)
Array
(
[ID] => 1
[TITLE] => analyst
[COMPANY_ID] => 1
[NAME] => one
)
执行此查询时,将输出到PHP fetch关联数组的my ID字段返回为1
除了ID之外,输出按预期工作
为什么我的ID值在变化
______________________
方法:
protected function search_joined($parameters, $func){
$field = "*";
if(isset($parameters["fields"])){
if($parameters["fields"] != "*" && gettype($parameters["fields"]) == gettype(array())){
if(count($parameters["fields"]) == 2){
$field = "";
foreach($parameters["fields"] as $key=>$v){
foreach($v as $v_){
$field.= $parameters["tables"][$key] . "." . $v_ . ",";
}
}
$field = rtrim($field, ",");
}
}
}
$cond_ = "";
$values = array();
if(gettype($parameters["condArry"]) == gettype(array())){
$COND_TYPE = " AND ";
foreach($parameters["condArry"] as $v){
$operator = " = ";
if($v[1][0] == "%" || substr($v[1], -1) == "%"){
$operator=" LIKE ";
}
if(substr($v[1], 5) == "L::_>"){
$operator=" > ";
$v[1] = str_replace($v[1], "L::_>", "");
}
if($v[1][0] == "!"){
$operator=" != ";
//$v[1] = str_replace($v[1], "!", "");
$v[1] = substr($v[1], 1);
}
$COND_TYPE = (
(isset($v[2]))?
(
($v[2] == "&")? " AND " :
(
(($v[2]=="||")? " OR ": "")
)
): " AND "
);
$unique = md5($v[0] . $v[1]);
$cond_.= $v[0] . $operator . ":".substr($v[0], strpos($v[0], ".") + 1).$unique. " " . $COND_TYPE . " ";
$values[':'.substr($v[0], strpos($v[0], ".") + 1).$unique] = $v[1];
}
$cond_ = "WHERE (" . substr($cond_, 0, strlen($COND_TYPE)*(-1)) . ")";
}
//$cond_ = rtrim($cond_, ",");
$joiner = $parameters["tables"][0] . "." . $parameters["joiner"][0] . "=" . $parameters["tables"][1] . "." . $parameters["joiner"][1] . " ";
$sql = "SELECT ". $field . " FROM " . $parameters["tables"][0] . " INNER JOIN " . $parameters["tables"][1] . " ON (" . $joiner . ") " .$cond_ . (isset($parameters["LIMIT"])? "LIMIT " . $parameters["LIMIT"]: "");
echo $sql;
if(isset($parameters["test"])){
if($parameters["test"] == true){
echo "<br>". $sql . "<br>";
}
}
//echo "<br>". $sql . "<br>";
$q = $parameters["connection"]->prepare($sql);
foreach($values as $key => $v){
$q->bindvalue($key, $v);
echo "<br>" . $key . " : " . $v . "<br>";
}
$q->execute();
while($row = $q->fetch(PDO::FETCH_ASSOC)) {
if(!$func($row)){
break;
}
}
$conTableArry = null;
}
您应该能够通过为结果集使用唯一的列名来解决这个问题(您当前使用了
ID
两次)
将SQL更改为以下内容:
"SELECT
listings.ID,
listings.TITLE,
listings.COMPANY_ID,
companies.ID AS CID,
companies.NAME
FROM listings
INNER JOIN companies ON (listings.COMPANY_ID = companies.ID )
WHERE (listings.TITLE = :p1
AND companies.NAME = :p2 )LIMIT 10"
注意第五行。我已将其从
companys.ID
更改为companys.ID作为CID
您应该能够通过为结果集使用唯一的列名来解决此问题(您当前使用ID
两次)
将SQL更改为以下内容:
"SELECT
listings.ID,
listings.TITLE,
listings.COMPANY_ID,
companies.ID AS CID,
companies.NAME
FROM listings
INNER JOIN companies ON (listings.COMPANY_ID = companies.ID )
WHERE (listings.TITLE = :p1
AND companies.NAME = :p2 )LIMIT 10"
注意第五行。我已将其从
companys.ID
更改为companys.ID作为CID
您的SQL中有一些令人困惑的语法
SELECT
listings.ID,
listings.TITLE,
listings.COMPANY_ID,
companies.ID,
companies.NAME
FROM listings
INNER JOIN companies ON (listings.COMPANY_ID = companies.ID )
WHERE (listings.TITLE = :p1 AND companies.NAME = :p2 )
LIMIT 10
您有两个ID
列,并且没有别名。因此,您可能会得到第二个ID
返回。尝试对第二个ID
列使用别名,然后重试
SELECT
listings.ID,
listings.TITLE,
listings.COMPANY_ID,
companies.ID AS comp_id,
companies.NAME
SQL中有一些令人困惑的语法
SELECT
listings.ID,
listings.TITLE,
listings.COMPANY_ID,
companies.ID,
companies.NAME
FROM listings
INNER JOIN companies ON (listings.COMPANY_ID = companies.ID )
WHERE (listings.TITLE = :p1 AND companies.NAME = :p2 )
LIMIT 10
您有两个ID
列,并且没有别名。因此,您可能会得到第二个ID
返回。尝试对第二个ID
列使用别名,然后重试
SELECT
listings.ID,
listings.TITLE,
listings.COMPANY_ID,
companies.ID AS comp_id,
companies.NAME
显示实际的pdo代码。我们无法帮助您。需要显示您的php代码。好的,但是如果您因为缺少资源而不理解某些内容,请不要抱怨。我现在将用一个片段更新帖子。我确信问题是mysql语句,而不是PHP。我从未调用过更改ID或ID的关联值。问题是您对两列使用了
ID
。PHP选择使用companys.ID
(由于您的加入条件,该值始终为1)。如果您将companys.ID改为CID
,则数组中将有5个元素,而不是4个(新的元素是CID)。显示实际的pdo代码。我们无法帮助您。需要显示您的php代码。好的,但是如果您因为缺少资源而不理解某些内容,请不要抱怨。我现在将用一个片段更新帖子。我确信问题是mysql语句,而不是PHP。我从未调用过更改ID或ID的关联值。问题是您对两列使用了ID
。PHP选择使用companys.ID
(由于您的加入条件,该值始终为1)。如果您将companys.ID改为CID
,则数组中将有5个元素,而不是4个(新的元素是CID)。是的,在我的ID上使用AS LID解决了这个问题。目前,我正在从参数(调用者)扩展它。我需要编写另一种方法来检测这种情况。非常感谢。是的,用我的身份证明解决了这个问题。目前,我正在从参数(调用者)扩展它。我需要编写另一种方法来检测这种情况。非常感谢。你的答案也是正确的,但帕特里克在关键点上击败了你!你的答案也是正确的,但帕特里克在关键点上击败了你!