PHP MySQLi Prepared语句:Fetch不返回连接的结果
我忘了是从哪里复制的(我想是一个用户在php.net上发布的),但是这个函数用于获取准备好的和正常的MySQLi语句的结果,当与包含简单内部联接的语句一起使用时,不会返回任何结果,至少是我尝试过的:PHP MySQLi Prepared语句:Fetch不返回连接的结果,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我忘了是从哪里复制的(我想是一个用户在php.net上发布的),但是这个函数用于获取准备好的和正常的MySQLi语句的结果,当与包含简单内部联接的语句一起使用时,不会返回任何结果,至少是我尝试过的: function fetch($result){ $array = array(); if($result instanceof mysqli_stmt){ $result->store_result(); $
function fetch($result){
$array = array();
if($result instanceof mysqli_stmt){
$result->store_result();
$variables = array();
$data = array();
$meta = $result->result_metadata();
while($field = $meta->fetch_field()){
$variables[] = &$data[$field->name];
}
call_user_func_array(array($result, 'bind_result'), $variables);
$i=0;
while($result->fetch()){
$array[$i] = array();
foreach($data as $k=>$v)
$array[$i][$k] = $v;
$i++;
}
}elseif($result instanceof mysqli_result){
while($row = $result->fetch_assoc())
$array[] = $row;
}
return $array;
}
我一直在尝试这样使用它(所有这些函数都是$database类的方法):
这将不返回任何内容:
$list=$database->query("SELECT a.field1, b.field2 FROM table1 AS a INNER JOIN table2 AS b ON a.id_table2=b.id WHERE a.someid=?", array($someid));
这很好:
$list=$database->query("SELECT field1, field2 FROM table1 WHERE someid=?", array($someid));
如果我打印出获取结果的元数据,它会显示字段已被选中,等等,但在fetch()函数中仍然不会给出最终结果
感谢您的帮助
谢谢
编辑这里是整个班级的内容
<?php
class database{
var $HOST="xx.xx.xx.xxx";
var $USER="xxxxxxxxxxx";
var $PASS='xxxxxxxxxx';
var $DATABASE="my_database";
var $sql;
function database(){
$this->sql=new mysqli($this->HOST, $this->USER, $this->PASS, $this->DATABASE);
if($this->sql->connect_errno){
echo "ERROR - No MySQL connection: ".$mysqli->connect_error;
exit;
}
}
function query($str, $values){
if($stmt=$this->sql->prepare($str)){
$types=$this->castArrayAsString($values);
array_unshift($values, $types);
call_user_func_array(array(&$stmt, 'bind_param'), $this->makeValuesReferenced($values));
$stmt->execute();
$result=$this->fetch($stmt);
if(empty($result)){
$return=true;
}else{
$return=$result;
}
$stmt->close();
}else{
echo $this->sql->error;
$return=false;
}
return $return;
}
function fetch($result){
$array = array();
if($result instanceof mysqli_stmt){
$result->store_result();
$variables = array();
$data = array();
$meta = $result->result_metadata();
while($field = $meta->fetch_field()){
$variables[] = &$data[$field->name];
}
call_user_func_array(array($result, 'bind_result'), $variables);
$i=0;
while($result->fetch()){
$array[$i] = array();
foreach($data as $k=>$v)
$array[$i][$k] = $v;
$i++;
}
}elseif($result instanceof mysqli_result){
while($row = $result->fetch_assoc())
$array[] = $row;
}
return $array;
}
function close(){
$this->sql->close();
}
function castArrayAsString($array){
$types="";
foreach($array as $key => $value) {
if(is_numeric($value)){
if(is_float($value)){
$types.="d";
}else{
$types.="i";
}
}else{
$types.="s";
}
}
return $types;
}
function makeValuesReferenced($arr){
$refs=array();
foreach($arr as $key => $value){
$refs[$key] = &$arr[$key];
}
return $refs;
}
}
$database=new database;
返回0结果集的查询正在执行“内部联接”,这意味着源表和目标表必须为查询中链接的列共享相同的值(在本例中为a.id\u table2和b.id)。很可能您没有任何匹配值,因此得到的结果集为0。尝试左外连接
尝试以下操作,查看是否返回结果:
"SELECT a.field1, b.field2 FROM table1 AS a INNER JOIN table2 AS b ON a.id_table2=b.id WHERE a.someid = :someId"
$dbo = new Database();
$stmt = $dbo->sql->prepare($sql);
$stmt->bindValue(':someId', $someId, PDO::PARAM_INT);
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
var_dump($row);
}
a.id_table2和b.id的值确实匹配,我尝试了一个外部连接,得到了相同的结果。为了确保我的SQL没有错,我在phpMyAdmin中检查了它,它返回了所需的结果,没有问题。看起来不是代码,查询本身有问题。你可以发布一个模式的片段吗?当然,table1:id(int,autoinc),id_table2(int),field1(varchar),field2(varchar)table2:id(int,autoinc),field1(varchar),field2(varchar),我在SQL提示符中尝试了我遇到问题的确切查询,它确实有效,但在上面的代码中没有,这让我相信它就是代码。可能与在上使用有关。我将发布整个类以进行测试。好的,很抱歉,我没有从命令行获得sql,但没有在编写的代码中。好的,sql是有效的,只需要找出代码不起作用的原因。在查询中绑定参数有很多复杂的逻辑,这让我相信参数没有正确绑定。我将很快做一些测试,并发布我的发现。
"SELECT a.field1, b.field2 FROM table1 AS a INNER JOIN table2 AS b ON a.id_table2=b.id WHERE a.someid = :someId"
$dbo = new Database();
$stmt = $dbo->sql->prepare($sql);
$stmt->bindValue(':someId', $someId, PDO::PARAM_INT);
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
var_dump($row);
}