Я знаю: это было сделано до смерти.
Но, поверьте мне, я довольно долго искал, как это исправить. То, что я пытаюсь достичь, - это оболочка базы данных PDO MySQL для использования с 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 );
}
Пример Б: doQuery( $query, $sqlParams, $return = FALSE, $queryType = QueryType::None )
Эта функция относительно проста: все, что она делает, — это привязывает значения и выполняет инструкцию, быстро проверяя, какой тип возвращать (типы возвращаемых значений, которые являются «строка», «столбец» или «все», определяются класс 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' => '[email protected]' )
);
var_dump( $res );
Другие комментарии
Я узнал, что есть что-то не так с моим кодом, я просто не понимаю, что именно это может быть. Что касается моих навыков отладки, я изучил довольно много этой проблемы, и кажется, что эта ошибка очень распространена. Моя главная цель - заставить эту оболочку работать, и если кто-то увидит какие-либо ошибки в самом коде (в том числе те, которые выходят за рамки этой проблемы, в частности), сообщите мне об этом.
Всем, кто предлагает руку в этом: большое спасибо.