![](/img/trans.png)
[英]PDO Prepared Statements: having trouble binding multiple values to query
[英]Having trouble binding strings to a PDO query in PHP
我正在嘗試將變量綁定到 PHP PDO 查詢
變量 $breed_var、$species_var 和 $year_var 表示表單輸入,因此它們可能是整數或空/null
這是我的代碼:
<?php
$breed_var = 11;
$species_var = 'species';
$year_var = 2016;
echo "<h1>Test</h1>";
$db_servername = "xxx";
$db_username = "xxx";
$db_password = "xxx";
$db_dbName = "xxx";
$pdo = new PDO("mysql:host=$db_servername;dbname=$db_dbName", $db_username, $db_password);
$pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn = $pdo;
$query = ' SELECT *
FROM livestock
WHERE breed = :breed AND species = :species AND YEAR(date_of_birth) = :year
ORDER BY species, livestock_name';
$sql = $conn -> prepare($query);
$sql -> bindValue(':species', $species_var, PDO::PARAM_STR);
$sql -> bindValue(':year', $year_var, PDO::PARAM_STR);
$sql -> bindValue(':breed', $breed_var, PDO::PARAM_STR);
$sql -> execute();
$conn = null;
$row = $sql->fetch(PDO::FETCH_ASSOC);
echo "<p>species :: $species_var, year:: $year_var, breed: $breed_var</p>";
print_r($sql);
echo "<br /><br />";
print_r($row);
echo "<br /><br />";
while($row = $sql->fetch(PDO::FETCH_ASSOC)){
echo "<p>$row[uk_tag_no] :: $row[livestock_name]</p>";
}
?>
如果我在 MySQL 中運行以下命令,它會返回結果:
SELECT *
FROM livestock
WHERE breed = 11 AND species = species AND YEAR(date_of_birth) = 2016
ORDER BY species, livestock_name
如果我改變
$species_var = 'species';
至
$species_var = 1;
它有效,所以問題必須是綁定?
這是數據庫表:
CREATE TABLE `livestock` (
`id` int(11) NOT NULL,
`species` int(11) NOT NULL,
`livestock_name` text DEFAULT NULL,
`gender` varchar(10) NOT NULL,
`uk_tag_no` varchar(500) DEFAULT NULL,
`previous_tags` varchar(255) CHARACTER SET ascii DEFAULT NULL,
`for_slaughter` tinyint(4) NOT NULL DEFAULT 0,
`pedigree_no` varchar(500) DEFAULT NULL,
`date_of_birth` date DEFAULT NULL,
`date_of_sale` date DEFAULT NULL,
`date_of_death` date DEFAULT NULL,
`mother` int(11) DEFAULT NULL,
`father` int(11) DEFAULT NULL,
`home_bred` tinyint(4) NOT NULL,
`origin` text DEFAULT NULL,
`breed` int(11) NOT NULL,
`notes` text DEFAULT NULL,
`deleted` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
它不會像species = species
那樣工作。 參數始終被視為值,而不是列名。 所以就好像你寫了條件species = 'species'
。
但是您的物種列是 integer,因此將 integer 列與字符串進行比較會將字符串隱式轉換為 integer。 在 MySQL 中,字符串的 integer 值基於字符串中的任何前導數字,然后忽略非數字字符。 所以'species'
的 integer 值為 0。
它最終就像您設置了條件species = 0
一樣工作。
重新評論:
根據輸入,使用搜索詞進行 SQL 查詢不必很麻煩。 我經常這樣做。 這是基於您的案例的示例:
$params = [];
$terms = [];
if ($species_var) {
$params['species'] = $species_var;
$terms[] = 'species = :species';
}
if ($breed_var) {
$params['breed'] = $breed_var;
$terms[] = 'breed = :breed';
}
if ($year_var) {
$params['year'] = $year_var;
$terms[] = 'YEAR(date_of_birth) = :year';
}
if ($terms) {
$whereClause = 'WHERE ' . implode(' AND ', $terms);
}
$query = " SELECT *
FROM livestock
$whereClause
ORDER BY species, livestock_name";
$sql = $conn -> prepare($query);
$sql -> execute($params);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.