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 не дают результатов, то вы, вероятно, что один из следующих других проблем, вместо:
- есть другая ошибка PHP где-то в коде , в результате чего это никогда не запускать
- этот код никогда не вызывается, и, таким образом, он никогда не будет выполнена
- вы неправильно имя таблицы, которая вызывает ошибку SQL
- таблица существует, но не имеет поле с именем
id
- обе таблица и поле есть, но t здесь нет записей в таблице
- некоторые другие случайные вещи, которые не приходят на ум
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, по уважительной причине. Он работает, он обновляется, и, самое главное, он стабилен.
Я действительно надеюсь, что вы нашли это полезным или, по крайней мере, узнали что-то от него. Надеюсь, другие считают это полезным.
Sooooo итерации массива? –
Вы уверены, что '$ fname' имеет значение? –
Синтаксис SQL .... имена таблиц, такие как 'vfp_cart66_accounts', не являются строковыми литералами, поэтому не цитируйте их .... если вы абсолютно должны использовать обратные обратные ('), а не обычные кавычки (') –