簡體   English   中英

在 PHP 中將字符串綁定到 PDO 查詢時遇到問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM