Я знаю: это было сделано до смерти.
Но, поверьте мне, я довольно долго изучал, как это исправить.То, чего я пытаюсь добиться - это оболочка базы данных MySQL PDO для использования с PDO, которую я могу просто включить в свой код.Моя главная проблема связана, в частности, с двумя функциями, а также с фактической привязкой параметров, которые я пытаюсь достичь.Причина, по которой я заявляю две функции в отличие от одной, заключается в том, что, несмотря на все мои усилия, я не смог определить, какая из них пытается решить проблему.Переменная, которую я var_dump
ed, подтвердила, что это не переменная, это что-то еще.Тем не менее, тот факт, что я получаю эту ошибку в первую очередь, означает, что что-то должно быть неправильно с кодом.
Приложение 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 );
Другие комментарии
Я узнал, что что-то не так с моимкод, я просто потерял, что именно это может быть.Что касается моих навыков отладки, я исследовал эту проблему довольно немного, и кажется, что эта ошибка очень распространена.Моя главная цель - заставить эту оболочку работать, и если кто-то увидит какие-либо ошибки в самом коде (включая те, которые выходят за рамки этой проблемы, в частности), пожалуйста, дайте мне знать.
Всем, кто предлагаетрука в этом: большое спасибо.