PHP查询MySQL以返回单个值


PHP query to MySQL to return single value

我对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]);