我是PHP和SQL的新手。我是android的java和XML开发人员。我在这里遇到问题,因为我只需要返回一个值,并且似乎无法从pdo准备的查询中获取它。我正在寻找的只是返回devId"设备ID"从一张桌子插入另一张桌子。 " USER_ID"是自动递增的主要和代表不同的用户。每一行都有一个" devId" varchar()列。请帮帮我。我需要" devId"的值。对于" user_id"我经过了。非常简单,你会想到返回这个单一值。
$query = $pdo->prepare("SELECT devId FROM accounts WHERE user_id='{$user->user_id}'");
$query->execute();
$result = $query->fetchAll();
$pdo->exec("INSERT INTO devicesTable(devId) VALUES('{$result[0]}')");
答案 0 :(得分:3)
如果使用->fetchAll()
,则返回所有结果,但返回到关联数组数组
这可能会更容易,因为您只有一个结果行,其中包含一列
$stmt = $pdo->prepare("SELECT devId
FROM accounts
WHERE user_id=:id");
$stmt->bindParam(':id', $user->user_id, PDO::PARAM_INT);
$stmt->execute();
$stmt->bindColumn('devId', $devId);
$stmt->fetch(PDO::FETCH_BOUND))
$cnt = $pdo->exec("INSERT INTO devicesTable(devId) VALUES('$devId')");
if ( $cnt === FALSE ) {
echo 'Nothing inserted';
print_r($db->errorInfo());
} else {
echo "Inserted $cnt rows";
}
答案 1 :(得分:0)
fetchAll()
方法返回一个数组数组。第一个数组是行,因此$result[0]
,$result[1]
等等将是第一行,第二行和后续行的关联数组。然后,您必须按名称访问该列:例如$result[0]['devId']
。
但你必须确保该行实际存在
if(!empty($result))
$pdo->exec("INSERT INTO devicesTable(devId) VALUES('{$result[0]['devId']}')");
但是,如果您不需要devId
其他任何内容,您可以在一个查询中写下
"INSERT INTO devicesTable(devId) SELECT devId FROM accounts WHERE user_id='{$user->user_id}'"
此外,您正在使用预准备语句。你已经有了这些,所以请使用参数而不是连接字符串。
$stmt = $pdo->prepare("INSERT INTO devicesTable(devId) SELECT devId FROM accounts WHERE user_id=:userId");
$stmt->execute([':userId'=>$user->user_id]);
答案 2 :(得分:0)
首先,PDOStatement::fetchAll()
返回 2维数组,其中包含所有结果集的行;第二,那不是你如何使用准备好的陈述。
准备语句背后的想法是,在准备它时插入占位符,然后在执行时将占位符绑定到特定值,并且可以使用不同的绑定值重复执行查询而无需重新分析查询。此外,准备好的语句会自动处理类型匹配,引用和转义等详细信息。
$stmtSel = $pdo->prepare("SELECT devId
FROM accounts
WHERE user_id=:id");
$stmtSel->bindParam(':id', $user->user_id, PDO::PARAM_STR);
$stmtSel->execute();
$stmtSel->bindColumn('devId', $devId);
$stmtSel->fetch(PDO::FETCH_BOUND))
$stmtIns = $pdo->prepare('INSERT INTO devicesTable (devId) VALUES(:devId)')
$pdo->execute(array(':devId' => $devId));
(请注意,这与RiggsFolly的解决方案几乎相同,只是我使用两个预先存储在单独变量中的预准备语句,因此可以重复使用它们。)