【发布时间】:2012-04-15 05:57:25
【问题描述】:
我知道:这已经被做死了。
但是,相信我,我一直在研究如何解决这个问题。我想要实现的是一个用于 PDO 的 PDO MySQL 数据库包装器,我可以将其合并到我的代码中。我的主要问题尤其源于两个功能,以及我试图达到的参数的实际绑定。我之所以说 两个 函数而不是一个函数,是因为尽管我努力了,但我还是无法确定哪个函数正在尝试解决问题。我var_dumped 的变量已经确认它不是变量,它是别的东西。尽管如此,我首先遇到此错误这一事实意味着 something 代码一定有问题。
展览 A: fetch( $table, $columns, $whereArgs )
这个函数的目的是简单地获取一行。这是通过接受要获取的行的表以及任何列和 where 子句来实现的,以便专门完成任务。一旦提交了参数,就会调用一两个循环来动态形成查询。
public function fetch( $table, $columns, $whereArgs )
{
if ( $whereArgs === NULL && $columns === NULL ) return false;
$select = "SELECT ";
$where = " WHERE ";
$iQuery = 0;
$sqlParams = array();
$columnCount = count( $columns ) - 1;
foreach( $whereArgs as $key => $value )
{
$paramKey = sprintf( ':%s', $key );
$where .= sprintf( "`%s`= %s", $key, $paramKey );
$sqlParams[ "{$paramKey}" ] = sprintf( "%s", $value );
if ( $iQuery <= $columnCount )
{
$select .= sprintf( '`%s`', $columns[ $iQuery ] );
$select .= ', ';
}
else
{
$select .= ' ';
}
++$iQuery;
}
if ( $iQuery <= $columnCount )
{
for( ; $iQuery < $columnCount; ++$iQuery )
{
if ( $iQuery < $columnCount )
{
$select .= sprintf( '`%s`', $columns[ $iQuery ] );
$select .= ', ';
}
else
{
$select .= ' ';
}
}
}
$select .= sprintf( "FROM `%s`", $table );
$query = $select . $where;
return $this->doQuery( $query, $sqlParams, TRUE, QueryType::Row );
}
图表 B: doQuery( $query, $sqlParams, $return = FALSE, $queryType = QueryType::None )
这个函数相对简单:它所做的只是绑定值并执行语句,同时迅速检查要返回的类型(返回类型是'row'、'column'或'all')由类 QueryType 指定,该类超出了本问题的范围),然后返回任何要求的内容。
protected function doQuery( $query, $sqlParams, $return = FALSE, $queryType = QueryType::None )
{
$statement = $this->mConnection->prepare( $query );
foreach( $sqlParams as $param => $value )
{
$statement->bindValue( $param, $value );
}
$statement->execute( );
if ( $return )
{
switch( $queryType )
{
case QueryType::Row:
return $statement->fetch( );
case QueryType::Column:
return $statement->fetchColumn( );
case QueryType::All:
return $statement->fetchAll( );
case QueryType::None:
return $statement;
default:
return false;
}
}
}
图表 C: test.php
这只是我为测试数据库而编写的一个小测试脚本。
$database = new Database( 'evolve_admin' );
$res = $database->fetch(
'evol_users',
array( 'user.id', 'user.email', 'user.firstname' ),
array( 'user.email' => 'test1234@test.com' )
);
var_dump( $res );
其他评论
我了解到我的代码有问题,我只是不知道它到底是什么。就我的调试技巧而言,我对这个问题进行了相当多的研究,而且似乎这个错误很常见。我的主要目标是让这个包装器正常工作,如果有人发现代码本身有任何错误(包括特别是本问题范围之外的错误),请告诉我。
对于任何提供帮助的人:非常感谢。
【问题讨论】:
-
检查生成的SQL与绑定的参数个数,然后找出数量不匹配的原因。
-
问题是只绑定了一个参数。我已经测试了通过并绑定参数的 for 循环。我也可以输出变量,它们看起来和它们应该看起来的完全一样。
-
不,问题是没有绑定任何参数(或者更具体地说,您有 N 个参数并且正在绑定一些 x 使得 x
标签: php mysql pdo wrapper parameterized