绑定参数错误

时间:2015-12-26 17:09:01

标签: php mysql mysqli bindparam

我的链接缩短时出现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>

决心的拼写错误与它无关 提前谢谢,
扎克戴维斯

2 个答案:

答案 0 :(得分:2)

错误“在非对象上调用成员函数bind_param()”意味着$reslove不是对象,因此您无法在不是对象的函数上调用成员函数(也称为方法)宾语。 $resolve怎么不是一个对象?好吧,第49行的->prepare方法调用将返回false如果准备SQL语句时发生错误,当然,false是一个“非对象”,这样就会导致你得到的错误信息。

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

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

您遗漏了明确说明列名称及其顺序的(column1,column2,column3,...)。抛弃它,如果它确实有效,则存在风险和/或脆弱,因为您假设列符合您的值,这可能并非总是如此。更明智地陈述(column1,column2,column3,...)

更安全

答案 1 :(得分:0)

只需更改此

$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);