2016-05-13 3 views
0

У меня возникла проблема с переходом из mysql_ в PDO (я новичок в нем).mysql_ для проблемы миграции PDO

Я уже проделал большую часть работы, но есть функция, которая сводит меня с ума.

Здесь:

function fields($thequery) /* SELECT * FROM table */ 
{ 
    $fields=array(); 
    $fields['num']=mysql_num_fields($thequery); 
    for ($i = 0; $i < $fields['num']; $i++) { 
     $fields['data'][]=mysql_fetch_field($result, $i); 
    } 
    return $fields; 
} 

Я пытался прочитать некоторые другие должности, но я не могу понять это.

Это лучшее, что я могу на данный момент, но всегда получаю неопределенный индекс "num".

function fields($thequery) 
{ 
    global $pdo; /* Connection */ 

    $result = $pdo->prepare($thequery); 
    $result->execute(); 
    $fields['num'] = $result->rowCount(); 
    for ($i = 0; $i < $fields['num']; $i++) { 
     $fields['data'][]=$result->getColumnMeta($i); 
    } 
    return $fields; 
} 

Что я делаю неправильно с этим? Спасибо заранее!

+0

Какая польза от такой специфической функции? –

+0

@YourCommonSense Я заметил, что вы удалили свои комментарии под ответом Джей. Смешно, что; рядом с ним есть зеленый тик. Ешьте ли я свои слова? Я также беру это те (теперь удаленные) слова, на вкус немного горькие да? Как уксус вы можете сказать? * lol * Богатый; хорошо выглядит на вас. Разве вам не нравится это, когда люди правы, а вы неправы? О, но вы не признаете этого и не убираете свой нисходящий поток из своего ответа. NooOOoooo. –

ответ

1

У вас есть пара проблем. Во-первых, вы не объявите массив полей в вашей второй функции, $fields = array();, а затем у вас есть проблемы при подсчете строк:

$result->rowCount(); 

Ваш запрос, скорее всего, SELECT запрос, который не будет работать с rowCount()

с docs

PDOStatement :: ROWCOUNT() возвращает количество строк, затронутых в последнем INSERT, DELETE или UPDATE заявление, выполняемом соответствующего объекта PDOStatement.

Для SELECT, когда вы не делаете COUNT() запрос, Вы можете вернуть количество строк, как это после того, как $result->execute();

$rows = $result->fetchAll(); 
$num_rows = count($rows); 
+1

@YourCommonSense Да, видя, что вы думаете, что вы такой Бог БД. * «Какая польза от такой особенной функции?» * - Вы должны уметь это понять. Но, что тебе все равно? Вы должны сделать привычкой жить и позволить жить, а не распространять плохую карму. –

+0

@JayBlanchard Я думаю, у вас есть смысл, потому что я использовал SELECT *, чтобы получить количество строк в этой таблице. Я попробую, как вы сказали во вторник, потому что у меня есть все файлы, хранящиеся в офисе, и я подтвержу вас. –

+0

@NtnRanger у вас есть шанс проверить это? –

1

Я вижу проблему; вы звоните PDOStatement::rowCount(), когда вы намереваетесь позвонить PDOStatement::columnCount().

Ваш код должен быть

function fields($thequery) 
{ 
    global $pdo; /* Connection */ 

    $result = $pdo->prepare($thequery); 
    $result->execute(); 
    $fields['num'] = $result->columnCount(); // Change this line 
    for ($i = 0; $i < $fields['num']; $i++) 
    { 
     $fields['data'][] = $result->getColumnMeta($i); 
    } 
    return $fields; 
} 

Обратите внимание, что the documentation for PDOStatement::getColumnMeta() содержит следующие предупреждения:

Предупреждение Эта функция ЭКСПЕРИМЕНТАЛЬНАЯ. Поведение этой функции, , ее название и окружающая документация могут быть изменены без предварительного уведомления в следующей версии PHP . Эту функцию следует использовать на свой страх и риск.

Предупреждение Не все драйверы PDO поддерживают PDOStatement :: getColumnMeta().

+0

Ну, что я пытался получить с помощью rowCount(), было количество строк в таблице с запросом SELECT *, а не количеством столбцов. –

+1

Функция, которую вы показали нам, извлекает метаданные столбца * для каждого столбца; * для этого вам нужно количество * столбцов *, а не количество * строк. * Если вы хотите, чтобы количество строк вы использовали полностью отдельно потому что число строк ортогонально количеству столбцов или метаданных столбца. –

0

Ну, я опробовал то, что сказал Джей Бланшар и Дарвин фон Коракс.

Проблема была в массиве (я забыл объявить об этом) и columnCount().

Самая большая проблема заключалась в том, что я неправильно понял эту функцию. Я был уверен, что это подсчет строк ... Я не знаю, почему, теперь выглядит логично!

function fields($thequery) { 
    global $pdo; 

    $result = $pdo->prepare($thequery); 
    $fields = array(); 
    $result->execute(); 
    $fields['num'] = $result->rowCount(); 
    for ($i = 0; $i < $fields['num']; $i++) { 
     $fields['data'][]=$result->getColumnMeta($i); 
    } 
    return $fields; } 
+0

Нет проблем с объявлением массива. таким образом, этот ответ ничего не добавляет к Дарвиновскому. –

+0

Да, но, по крайней мере, этот парень допустил свою ошибку @ YourCommonSense, когда вы этого не сделали; это просто ваша «общая природа». О, и я поддержал это, чтобы сбалансировать ваш downvote. –

+0

@YourCommonSense, в чем проблема? Я просто добавил этот ответ, чтобы опубликовать полный исправленный ответ, основанный на том, что сказали два других парня (и я ответил на каждый комментарий, чтобы сказать, где они находятся). WTF –