[英]Mysql / PDO - Setting Variable
I'm having trouble trying to set a variable then use it in a select statement. 我在尝试设置变量然后在select语句中使用它时遇到了麻烦。 I keep getting a "general error" and can't figure out what I'm doing wrong. 我不断收到“一般错误”,无法弄清楚我在做什么错。 Any input would be appreciate. 任何输入将不胜感激。 I'm trying to set a variable using subqueries with named parameters. 我正在尝试使用带有命名参数的子查询来设置变量。
$query = $dbh->prepare("Set @available = (SELECT SUM(payments) FROM payments WHERE customer = :customer) - (SELECT SUM(charges) FROM charges WHERE customer = :customer); SELECT @available");
$query->bindParam(":customer", $customer);
$query->execute();
If you want to use MySQL user variables, for some reason, you don't need multi-queries support . 如果出于某种原因要使用MySQL用户变量, 则不需要多查询支持 。 They (user variables) live as long as you session (connection) is open. 只要您打开会话(连接),它们(用户变量)就会存在。 Therefore you can do something like this 因此,您可以执行以下操作
$customer = 1;
try {
$db = new PDO('mysql:host=localhost;dbname=dbname;charset=UTF8', 'user', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$sql = "SET @available = (SELECT SUM(payments) FROM payments WHERE customer = ?) -
(SELECT SUM(charges) FROM charges WHERE customer = ?)";
$query = $db->prepare($sql);
$query->execute(array($customer, $customer));
$query = $db->prepare("SELECT @available");
$query->execute();
$result = $query->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo "Exeption: " .$e->getMessage();
$result = false;
}
$query = null;
$db = null;
var_dump($result);
Sample output: 样本输出:
array(1) { [0]=> array(1) { ["@available"]=> string(6) "100.00" } }
PDO doesn't seem to offer any formalised support for multi-queries (but some support does seem to be available), but mysqli
does. PDO似乎不提供对多查询的任何形式化支持(但似乎确实有一些支持),但是mysqli
可以。 Neither offer support for prepared multiple statements, though. 不过,它们都没有为准备好的多条语句提供支持。
You can use mysqli
like this: 您可以像这样使用mysqli
:
$mysqli = new mysqli('servername', 'username', 'password', 'dbname');
$query = sprintf("Set @available = (SELECT SUM(payments) FROM payments WHERE customer = %1$s)" .
" - (SELECT SUM(charges) FROM charges WHERE customer = %1$s);".
" SELECT @available",
$mysqli->real_escape_string($customer) );
// Following code lifted from PHP Manual.
// This code will read multiple results, if they're available.
// Your query only returns one.
/* execute multi query */
if ($mysqli->multi_query($query)) {
do {
/* store first result set */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
$result->free();
}
/* print divider */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.