2013-12-24 9 views
-1

Я пытаюсь вытащить данные пользователя из таблицы Cart66, которые у меня есть, и поместить его в короткий код в wordpress. $ account - целое число, извлекаемое из данных сеанса. Код ниже ничего не возвращает.foreach loop ничего не возвращает

$account =Cart66Session::get(Cart66AccountId); 
global $wpdb; 
$fname=$wpdb->get_results("SELECT * FROM 'vfp_cart66_accounts' WHERE id = '$account',   ARRAY_N"); 
foreach ($fname AS $row) 
{ 
echo $row; 
} 

Это возвращает «Array»

return $fname; 
+0

Sooooo итерации массива? –

+0

Вы уверены, что '$ fname' имеет значение? –

+2

Синтаксис SQL .... имена таблиц, такие как 'vfp_cart66_accounts', не являются строковыми литералами, поэтому не цитируйте их .... если вы абсолютно должны использовать обратные обратные ('), а не обычные кавычки (') –

ответ

0

Ok, во-первых, может быть, я единственный, кто видел это, и это может быть источником всей проблемы, но у вас есть в конце вашей строки SQL, которая должна находиться в конце строки SQL, а не после запрошенного типа возврата:

// at the end of this line you have: '$account',  ARRAY_N"); 
// this should be changed to:  '$account'", ARRAY_N); 
$fname=$wpdb->get_results("SELECT * FROM 'vfp_cart66_accounts' WHERE id = '$account',   ARRAY_N"); 

Даже первый человек, который ответил на вопрос, не исправил вас, поэтому я предполагаю, что он этого не видел. Во-вторых, использование одиночных кавычек (') для исключения имени таблицы недопустимо. Если он вообще указан, используйте обратные ссылки (`). Одиночные кавычки указывают строку , а не базу данных, таблицу или поле, все три из которых должны указываться только с обратными циклами (за исключением служебных запросов, таких как SHOW). Используйте это вместо этого:

select * from `vfp_cart66_accounts` where id = '$account' 

В-третьих, как отмечают ваши комментаторы, вы можете быть уязвимы для SQL-инъекций. Убедитесь в том, чтобы использовать инструменты, которые WP дает вам, и сделать это, или подобное, вместо этого:

$fname = $wpdb->get_results(
    $wpdb->prepare(
    'select * from `vfp_cart66_accounts` where id = %d', 
    $account 
), 
    ARRAY_N 
); 

Наконец, вы запрашиваете массив из БД, но вы пытаетесь повторить его, как если бы это было скалярное значение. Это объясняет, почему печать значения $row дает "Array". Когда вы конвертируете array() в строку, по умолчанию вы получаете "Array", так как массивы могут быть сложными данными, которые не могут быть красиво преобразованы в строку. Как исправление этого, вы можете сделать одно из двух.

Во-первых, если нужен весь результирующий массив, который представляет всю строку таблицы, то вы можете просто изменить свой echo код следующим образом:

foreach ($fname as $row) { 
    // print the fname of the row 
    echo $row['fname']; 

    // do the other stuff you need to do with $row 
    ... 
} 

ИЛИ, если вы просто нуждаетесь в FName поле из этой таблицы, для данного идентификатора, вы могли бы использовать другую $wpdb функции, называемой $wpdb->get_var(), которая получает одно конкретное поле из первой записи полученных данных из базы данных, в сочетание с некоторыми незначительными изменениями SQL:

// use the get_var() function instead 
$fname = $wpdb->get_var(
    $wpdb->prepare(
    // 1) change the 'fields' of your sql to only get the `fname` field 
    // 2) also add limit 1, to reduce load by only asking for one row 
    // NOTE: #2 is optional really, because WP does this for you when using get_var, 
    //  but is good practice to only ask for what you need. so do it 
    'select fname from `vfp_cart66_accounts` where id = %d limit 1', 
    $account 
), 
    ARRAY_N 
); 

echo $fname; // print the value of field fname from vfp_cart66_accounts for id $account 

Теперь. Я не знаю конкретных людей Cart66.При этом, если вышеуказанные изменения в PHP, WordPress, и синтаксис SQL не дают результатов, то вы, вероятно, что один из следующих других проблем, вместо:

  1. есть другая ошибка PHP где-то в коде , в результате чего это никогда не запускать
  2. этот код никогда не вызывается, и, таким образом, он никогда не будет выполнена
  3. вы неправильно имя таблицы, которая вызывает ошибку SQL
  4. таблица существует, но не имеет поле с именем id
  5. обе таблица и поле есть, но t здесь нет записей в таблице
  6. некоторые другие случайные вещи, которые не приходят на ум

DEBUG # 1

Для # 1, вы могли бы попытаться повернуть на error_reporting() и display_errors в начале выполнение кода. В нормальном, заурядным PHP скрипт можно добавить следующие две строки где-то в начале кода:

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

Однако вы используете WordPress, так что вам нужно будет сделать что-то подобное в вашей WP- config.php файл:

// find the line that looks like this and comment it out 
// define('WP_DEBUG', false); 

// add these two lines directly below it 
define('WP_DEBUG', true); 
ini_set('display_errors', 1); 

DEBUG # 2

Убедитесь, что код работает. Не бойтесь бросить оператор die() прямо над ним, чтобы убедиться, что он работает. Что-то вроде этого:

// add a die() before everything 
die('I am running. Awesome!'); 

// revised code 
$account = Cart66Session::get(Cart66AccountId); 
global $wpdb; 
$fname = $wpdb->get_var(
    $wpdb->prepare(
    'select fname from `vfp_cart66_accounts` where id = %d limit 1', 
    $account 
), 
    ARRAY_N 
); 
echo $fname; 

DEBUG # 3

Для отладки # 3, вам необходимо либо доступ к инструменту командной строки для MySQL или какой-либо тип графического интерфейса, как PhpMyAdmin, так что вы можете запустить запрос непосредственно из базы данных. Вот запрос, вы должны запустить:

show tables like 'vfp_cart66_%'; 

Это пример одного из немногих мест в SQL, которые вы когда-нибудь процитировать имя таблицы в одинарных кавычках. Запустив это, вы получите список всех таблиц, начинающихся с vfp_cart66_. Если вы не получите никаких результатов, ваше имя таблицы неверно. Если ваши результаты не включают vfp_cart66_accounts, имя вашей таблицы неверно. Если вы видите vfp_cart66_accounts, вам нужно идти.

DEBUG # 4

Это один будет необходимо запустить непосредственно из БД или через что-то вроде PHPMYADMIN тоже. Вы пытаетесь убедиться, что у вас есть правильное имя поля. То, как вы сделать это:

show create table `vfp_cart66_accounts`; 

предположительно, поле вы звоните id бы быть auto_incremented поле в таблице.Таким образом, вы ищете строку, похожее на это один:

`id` bigint(20) NOT NULL AUTO_INCREMENT, 

Убедитесь, что линия, которая имеет AUTO_INCREMENT на нем, начинается с:

`id` 

Если это не так, и имя что-то другое, кроме id, то вы, вероятно, имеете неправильное имя поля.

DEBUG # 5

Убедитесь, что вы на самом деле есть данные для отображения. С вашей mysql консоли или PhpMyAdmin, запустите:

select * from `vfp_cart66_accounts` limit 1; 

Если вы ставите какие-либо результаты, то у вас есть данные, и вы хорошо.

DEBUG # 3 - # 5 (методы альтернативные)

Другой вариант вы имеете сбросить $wpdb объекта, непосредственно после выполнения запроса, так как он содержит последнюю ошибку, полученную от MySQL. Вы можете сделать это следующим образом:

$fname = $wpdb->get_var(
    $wpdb->prepare(
    'select fname from `vfp_cart66_accounts` where id = %d limit 1', 
    $account 
), 
    ARRAY_N 
); 

// dump a readable version of the $wpdb object 
echo '<pre>'; 
print_r($wpdb); 
die('</pre>'); 

Часто, читая сообщение об ошибке MySQL помогает сузить проблему в вашем синтаксисе SQL.

DEBUG # 6

Если ничего из этого не помогло вообще, то вам нужно будет использовать свой опыт, чтобы trackdown случайную ошибку, либо в ваших плагинов или тему, что может быть в буквальном смысле ничего. Вы можете даже не копаться в основном коде WP, потому что, хотя у него есть несколько незначительных ошибок, не связанных с вашей проблемой, которые восстанавливаются, когда мы говорим, это одна из самых стабильных платформ CMS. Он используется более 10 миллионами сайтов в Интернете, чем любая другая CMS, по уважительной причине. Он работает, он обновляется, и, самое главное, он стабилен.

Я действительно надеюсь, что вы нашли это полезным или, по крайней мере, узнали что-то от него. Надеюсь, другие считают это полезным.

+0

Ваш ответ был очень тщательным и полезным, спасибо. Я использовал ваше предложение get_var с одним незначительным tweek.Я уничтожил ARRAY_N, и он работал как чемпион! – user3131000

+0

потрясающий! рад, что смогу помочь человеку. – loushou

0
$fname=$wpdb->get_results(
    "SELECT * FROM `vfp_cart66_accounts` WHERE id = '$account'", 
    ARRAY_N" 
); 
+0

Обратные тики не помогли, все равно ничего не возвращает – user3131000

+0

Я должен уточнить, цикл ничего не возвращает, $ fname возвращает слово «Массив» – user3131000

Смежные вопросы