我对PHP和SQL非常陌生。我是android的java和XML开发人员。我在这里遇到了问题,因为我只需要返回一个值,而似乎无法从pdo准备的查询中获得它。我所寻找的只是从一个表中返回devId"device id",并将其插入另一个表。"user_id"是自动递增的主用户,代表不同的用户。每一行都有一个"devId"varchar()列。请帮帮我。我需要我传递的"user_id"的"devId"值。返回这个值非常简单。
$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]}')");
如果使用->fetchAll()
,则返回所有结果,但返回到assoc数组的数组中
这可能更容易,因为中只有一个结果行和一列
$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";
}
首先,PDOStatement::fetchAll()
返回一个二维数组,该数组包含结果集的所有行;其次,这不是你使用准备好的语句的方式。
准备语句背后的思想是,在准备语句时插入占位符,然后在执行时将占位符绑定到特定值,并且可以使用不同的绑定值重复执行查询,而无需重新分析查询。此外,准备好的语句会自动处理类型匹配、引用和转义等细节。
$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的解决方案几乎相同,只是我的解决方案使用了存储在不同变量中的两个准备好的语句,这样它们都可以重用。)
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]);