PHPAPI绑定参数得到错误

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (50)
<?php
$username = '***';
$password = '***';
$database = '***';
$hostname = 'localhost';

$stock_symbol = '1301.T';
$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$stmt = "SELECT * FROM `price/volume` WHERE `stock_symbol`=:stock_symbol";
$stmt->bindParam(':stock_symbol', $stock_symbol, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchALL(PDO::FETCH_ASSOC);
echo json_encode($result);
 ?>

我是一名初学者,并试图为我的网站创建一个简单的PHP API。以上是API代码。当我在浏览器上运行API时出现错误:

致命错误:未捕获错误:调用/ storage / ssd3 / 769 / /public_html/api.php:10中的字符串上的成员函数bindParam()堆栈跟踪:#storage {s} / ssd3 / 769 /第10行的public_html / api.php

提问于
用户回答回答于

这一行:

$stmt = "SELECT * FROM `price/volume` WHERE `stock_symbol`=:stock_symbol";

将变量$stmt设置为该SQL字符串。所以,$stmt是一个字符串。你看到的错误是尝试在其上调用方法的结果。字符串不是PHP中的对象,就像它们在其他语言中一样,并且它们没有方法。因此,每当你尝试在任何字符串上调用任何方法时,你都会遇到类似的错误。

$str = "any string";
$try = $str->anyMethod();
// Fatal error: Uncaught Error: Call to a member function anyMethod() on string

你需要从该字符串创建一个预准备语句,而不是简单地将字符串分配给$stmt

$stmt = $dbh->prepare("SELECT * FROM `price/volume` WHERE `stock_symbol`=:stock_symbol");

PDO prepare方法返回一个PDOStatement对象,其中包含bindParam

用户回答回答于

你应该prepare()在绑定占位符之前调用。$dbh包含数据库连接。

修改版

<?php

try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
    $stmt = "SELECT * FROM `price/volume` WHERE `stock_symbol`=:stock_symbol";
    $qryResult = $dbh->prepare($stmt);
    $qryResult->bindParam(':stock_symbol', $stock_symbol, PDO::PARAM_STR);
    $qryResult->execute();
    $result = $qryResult->fetchALL(PDO::FETCH_ASSOC);
    echo json_encode($result);
} catch (PDOException $pdoe) {
    echo ($pdoe->getMessage());
    exit;
}

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励