我正在尝试从我拥有的Cart66表中提取用户数据并将其放入wordpress中的短代码中。 $ account是从会话数据中提取的整数。以下代码不会返回任何内容。
$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 :(得分:0)
$fname=$wpdb->get_results(
"SELECT * FROM `vfp_cart66_accounts` WHERE id = '$account'",
ARRAY_N"
);
答案 1 :(得分:0)
好吧,首先,也许我是唯一一个看到这个问题的人,它可能是你整个问题的根源,但你的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
...
}
OR ,如果您只需要该表中的fname字段,对于给定的ID,您可以使用另一个名为$wpdb
的{{1}}函数来自数据库的结果数据的第一个条目中的一个特定字段,以及一些次要的SQL更改:
$wpdb->get_var()
现在。我不具备 Cart66 的具体知识。话虽如此,如果对PHP,WordPress和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
DEBUG#1
对于#1,您可以尝试在代码执行的早期启用id
和error_reporting()
。在正常运行的磨削PHP脚本中,您可以在代码的早期某处添加以下两行:
display_errors
但是,您使用的是WordPress,因此您需要在wp-config.php文件中执行以下操作:
error_reporting(E_ALL);
ini_set('display_errors', 1);
DEBUG#2
确保您的代码正在运行。不要害怕在它上面直接抛出// 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);
语句,以确保它正在运行。像这样:
die()
DEBUG#3
要调试#3,您需要访问MySQL的命令行工具或某些类型的GUI界面(如phpMyAdmin),以便您可以直接从数据库运行查询。以下是您应该运行的查询:
// 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;
这是SQL中唯一一个应该用单引号引用表名的地方的示例。运行此命令将生成以show tables like 'vfp_cart66_%';
开头的所有表的列表。如果没有结果,则表名错误。如果您的结果不包含vfp_cart66_
,那么您的表名称是错误的。如果你看到vfp_cart66_accounts
,那么你很高兴。
DEBUG#4
这个需要直接从数据库或像phpMyAdmin这样的东西运行。您正在尝试确保您具有正确的字段名称。你这样做的方式是:
vfp_cart66_accounts
假设您正在调用的字段show create table `vfp_cart66_accounts`;
将是表中的auto_incremented字段。因此,您正在寻找一条与此类似的线:
id
确保上面有`id` bigint(20) NOT NULL AUTO_INCREMENT,
的行以:
AUTO_INCREMENT
如果没有,并且名称是除`id`
以外的其他名称,那么您可能有错误的字段名称。
DEBUG#5
确保您确实要显示数据。从您的id
控制台或phpMyAdmin,运行:
mysql
如果你打赌任何结果,那么你有数据,而且你很好。
DEBUG#3 - #5(替代方法)
您拥有的另一个选项是在运行查询后直接转储select * from `vfp_cart66_accounts` limit 1;
对象,因为它包含您从MySQL收到的最后一个错误。你可以这样做:
$wpdb
通常,阅读MySQL错误消息有助于缩小SQL语法中的问题。
DEBUG#6
如果这些都没有任何帮助,那么你需要利用自己的经验来追踪你的插件或主题中的随机错误,这可能是什么。您甚至可能不会挖掘核心WP代码,因为虽然它确实有一些与您的问题无关的小错误,这些错误在我们说话时得到修复,但它是最稳定的CMS平台之一。互联网上超过1000万个网站中的更多网站使用它是有充分理由的。它有效,它是最新的,最重要的是,它是稳定的。
我真的希望你发现这有用或至少从中学到了一些东西。希望其他人发现它也很有用。