绑定参数错误

Bind Param Error

我的 link 缩短器出现 MySQL/MySQLi/PHP 错误,错误是:

Fatal error: Call to a member function bind_param() on a non-object in
/home/exabit/public_html/9ui/index.php on line 50

这是有问题的行。

$reslove->bind_param("ss",$link, $short_url);

这是剩余的代码

<?php
$data_base = new mysqli ("http://host38.qnop.net/~exab","exab_ml","MKnOz3A]h~aw","exab_ml");
function generateRandomString($length = 3) {
$key = 'abcdefghijklmnopqrstuvwxyz1234567890';
$keyLength = strlen($key);
$string = '';
for ($i = 0; $i < $length; $i++) {
$string .= $key[rand(0, $keyLength - 1)];
}
return $string;
}
if (isset($_GET['title'])) {
$reslove = $data_base->prepare("SELECT * FROM links WHERE title=?");
$reslove->bind_param("s", $_GET['title']);
$reslove->execute();
$goto = $reslove->get_result()->fetch_array();
$goto1 = $goto[1];
header("Location: $goto1");
}
if (isset($_POST['submit'])) {
$short_url = generateRandomString();
if (!preg_match("/^(http|https):/", $_POST['long_url'])) {
$_POST['long_url'] = 'http://'.$_POST['long_url'];
}
$link = $_POST['long_url'];
$reslove = $data_base->prepare("INSERT INTO links VALUES('',?,?)");
$reslove->bind_param("ss",$link, $short_url);
$reslove->execute();
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<center>
<form>
<p style="color:#05ff19;font-family:Tahoma;font-size:16px;text-align:center">Shortened Link: </p><input id=shortenedurl style="background-color:#000;color:#05ff19;font-family:Tahoma;font-size:16px;vertical-align:middle;border:1px solid #05ff19" type="text" value=<?php echo "9ui.co/$short_url";}?>'>
</form>
</center>

resolve 的拼写错误与此无关。
提前致谢,
扎克·戴维斯

错误 "Call to a member function bind_param() on a non-object" 意味着 $reslove 不是对象,因此您不能在不是对象的对象上调用成员函数(也称为方法)。 $resolve怎么可能不是对象呢?那么,如果在准备 SQL 语句时发生错误,第 49 行的 ->prepare 方法调用将 return false,当然,false 是一个 "non-object" 这样会导致您收到错误消息。

查看第 49 行,其中设置了 $resolve,嗯嗯 SQL 语句看起来很有趣。 INSERT 命令的语法通常是 ...

INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

您遗漏了明确说明列名及其顺序的 (column1,column2,column3,...)。忽略它,如果它确实有效,是有风险的 and/or 脆弱,因为您会假设列与您的值匹配,但情况可能并非总是如此。明确声明 (column1,column2,column3,...).

更安全

只需更改此

$reslove->bind_param("ss",$link, $short_url);

$reslove->bind_param($link, $short_url);

更新

在你的 prepare 语句中添加列名,然后像这样给它们一个值

$reslove = $data_base->prepare("INSERT INTO links (id, link, short_url) VALUES(?,?,?)");
$reslove->bind_param('',$link, $short_url);