我需要使用INNER JOIN和WHERE子句对我的数据库执行PHP PDO调用。
在navicat GUI中,此语句运行良好,我可以看到结果。问题出在有关字符串连接的php环境中。
我想格式化此请求,以便它可以被php消化:
SELECT * FROM tsourcetb as T INNER JOIN users as U ON U.username = T.username WHERE U.username = $username AND T.username = $username;
我想做什么
$sth = $db->prepare("SELECT * FROM tsourcetb as T INNER JOIN users as U ON U.username = T.username WHERE U.username = $username AND T.username = $username");
返回错误,表明没有变量名称的表。基本上,它将变量作为表的名称,返回是一个错误,指示不存在带有变量名的表。基本上,它将变量作为表名,而不是表名,而是将其作为表名(SELECT * FROM $ username)跳出语句的第一部分。)
目的是使表A的所有记录的用户名字段= =到表B的用户名字段,并从变量传递值。 感谢您提出任何实现我目标的建议。
更新
php是魔术,需要尝试并重新尝试。最后请帮助我实现目标:
$username = ($_POST['username']);
$password = ($_POST['password']);
$statement = $db->prepare('SELECT p.* FROM `tsourcetb` as p LEFT JOIN `users`as s ON p.username = s.username WHERE s.username = :username;');
$statement->bindParam(':username', $username, PDO::PARAM_STR);
$statement->execute();
/ *在这里-> $ statement-> fetchall(PDO :: FETCH_ASSOC)* /
$array_select = $statement->fetchall(PDO::FETCH_ASSOC);
echo json_encode($array_select, JSON_PRETTY_PRINT);
答案 0 :(得分:0)
尝试一下:
$stmt = $db->prepare("SELECT * FROM tsourcetb as T INNER JOIN users as U ON U.username = T.username WHERE U.username = :username AND T.username = :username");
$stmt->bindValue(':username', $username, PDO::PARAM_STR);
$stmt->execute();
您需要将值与准备好的语句绑定在一起
来源:Docs
答案 1 :(得分:0)
使用PDO进行动态查询时,必须绑定参数。 在查询中更改它。
$username -> :username
在拨打电话之前
$yourQueryObj->bindValue(':username', $username, PDO::PARAM_STR);
这就是为什么准备的语句比常规变量更安全的原因,因为在发送查询之前要为其分配类型。
您可以在此处阅读有关内容 http://php.net/manual/en/pdostatement.bindvalue.php
像这样准备后,您还应该可以使用参数数组来执行:
$sth = execute(array(':username'=> $username));
答案 2 :(得分:0)
<?php
$sth = $db->prepare("SELECT * FROM `tsourcetb` as T INNER JOIN users as U ON U.username = T.username WHERE U.username = ? AND T.username = ? ");
$sth->execute([$username,$username]);
$results = $sth->fetchall();
?>
用反引号包装您的表名,并使用占位符