【发布时间】:2016-05-20 00:26:43
【问题描述】:
这个问题之前已经回答过,但格式不同。
我正在尝试创建一个对象方法来获取数据库行。我不断收到标题错误。奇怪的是,如果我直接在父类方法中调用函数的相同代码,它就可以工作。这是两个例子。
示例 1:有效 从单独的 PHP 页面调用的函数,例如: $email = trim($_POST['email']); $password = trim($_POST['password']);
$found_user = User::authenticate($email, $password);
这是正在运行的功能。 (如果我要创建一个可重用的函数来测试我的代码是否有问题,我会设置该函数)
public static function authenticate($username="", $password="") {
$db = Database::getInstance();
$mysqli = $db->getConnection();
$field = 'email';
$sql_query = "SELECT * ";
$sql_query .= "FROM `".static::$table_name."`";
$sql_query .= "WHERE {$field}=? ";
$sql_query .= "LIMIT 1";
$stmt = $mysqli->stmt_init();
if (!$stmt->prepare($sql_query)) {
$error = "Errormessage: " . $mysqli->error;
return $error;
}
if (!$stmt->prepare($sql_query)) {
$error = "Errormessage: " . $stmt->error;
return $error;
} else {
$stmt->prepare($sql_query);
$valueType = gettype($username);
if ($valueType == 'string') {
$stmt->bind_param('s', $username);
} else if ($valueType == 'integer') {
$stmt->bind_param('i', $username);
} else if ($valueType == 'double') {
$stmt->bind_param('d', $username);
} else {
$stmt->bind_param('b', $username);
}
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_object();
}
}
现在,如果我以相同的方法但从扩展类(父类是扩展 DatabaseOptions 的用户)调用该函数。函数是这样写的:
public static function authenticate($username="", $password="") {
$dbObject = static::get_row('email', $username);
if (isset($dbObject)) {
return $dbObject;
}
}
DatabaseObject 中的函数:
public function get_row($field, $value) {
$db = Database::getInstance();
$mysqli = $db->getConnection();
$sql_query = "SELECT * ";
$sql_query .= "FROM `".static::$table_name."`";
$sql_query .= "WHERE {$field}=? ";
$sql_query .= "LIMIT 1";
$stmt = $mysqli->stmt_init();
if (!$stmt->prepare($sql_query)) {
$error = "Errormessage: " . $stmt->error;
return $error;
} else {
$stmt->prepare($sql_query);
$valueType = gettype($value);
if ($valueType == 'string') {
$stmt->bind_param('s', $value);
} else if ($valueType == 'integer') {
$stmt->bind_param('i', $value);
} else if ($valueType == 'double') {
$stmt->bind_param('d', $value);
} else {
$stmt->bind_param('b', $value);
}
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_object();
}
}
【问题讨论】:
-
进行了编辑。注意到我有: $stmt->bind_param('s', $value);在 if/else if 语句之后。即使删除后仍然有同样的错误
-
为什么else分支里还有第二个
$stmt->prepare($sql_query);? -
尝试摆脱
$stmt = $mysqli->stmt_init();而只是做if(!$stmt = $mysqli->prepare($sql_query))stmt_init()的文档对于返回值有点含糊(他们说它返回一个“对象”)。它可能是一个 mysqli 语句对象,尽管绝对没有必要使用stmt_init。此外,似乎只是在语句对象上调用prepare并没有对 那个 对象做任何事情。 -
感谢 VolkerK 和观察者。我做了两个编辑。仅删除 else 语句中的第二个准备保持与以前相同的错误。继续观察者的建议导致:在非对象上调用成员函数 prepare()
标签: php mysql prepared-statement