获取错误在非对象上调用成员函数query()

时间:2015-10-18 17:46:57

标签: php mysql sql

我基本上试图从表单上的多个字段中搜索表单,但不断收到错误 database_conn

<?php
$conn = mysqli_connect('xxxx', 'xxxxx', 'xxxxx', 'xxxxxx');
if (mysqli_connect_errno()) {
    echo "<p>Connection failed:".mysqli_connect_error()."</p>\n";
}
?>

php更新 - 我现在得到的错误是&#34;在非对象上调用成员函数fetch_assoc()&#34;

<?php

include 'database_conn.php';



$shoeSize = isset($_GET['shoeSize']) ? $_GET['shoeSize'] : null ;
$brandID = isset($_GET['brandID']) ? $_GET['brandID'] : null ;
$gender = isset($_GET['gender']) ? $_GET['gender'] : null ;

$sqlShoes = "SELECT shoeSize, brandID, gender FROM sh_shoe WHERE 1";

$sqlCondition = "";

IF($shoeSize != null ) {
    $sqlCondition = $sqlCondition . "SELECT shoeSize FROM sh_shoe WHERE 1 AND shoeSize = $shoeSize";
}
IF($brandID != null ) {
    $sqlCondition = $sqlCondition . "SELECT brandID FROM sh_shoe WHERE 1 AND brandID = $brandID";
}
IF($gender != null ) {
    $sqlCondition = $sqlCondition . "SELECT gender FROM sh_shoe WHERE 1 AND gender = $gender";
}

$sqlSearch = $sqlShoes . $sqlCondition;

$result = $mysqli->query($sqlSearch);

$rowShoes = $result->fetch_assoc();
// then to output
echo "<p>{$rowShoes['shoeSize']}</p>";

1 个答案:

答案 0 :(得分:1)

看到最初定义$mysqli的位置将是一个很好的起点。一些也可能导致代码失败的问题是......

$mysqli不是对象,它是在global行定义的空变量。 global用于在函数中访问变量,看起来不需要它。

您当前的联系是$conn。这是在程序上建立的。您的代码正在使用对象方法,因此我认为在您的db文件中将$conn行更改为:

$mysqli = new mysqli('xxxx', 'xxxxx', 'xxxxx', 'xxxxxx');

除非您在其他文件中使用$conn。如果这是你的第一个文件,这应该没问题。

此外:

+在PHP中没有连接,我认为这是JS语法。 .是如何连接的。

一旦更正,但您的查询将被错误地构建。您将构建一个查询

SELECT shoeSize, brandID, gender FROM sh_shoe WHERE 1SELECT shoeSize FROM sh_shoe WHERE 1 AND shoeSize = $shoeSize

您需要将用户输入分开,并仅将要搜索的列附加到查询中。

一个粗略的未经测试的答案,它也应该关闭整个SQL注入。

include 'database_conn.php';
global $mysqli;
$query = "SELECT shoeSize, brandID, gender FROM sh_shoe";
if(!empty($_GET['shoeSize'])) {
    $where[] = ' shoeSize = ' . $mysqli->real_escape_string($_GET['shoeSize']);
}
if(!empty($_GET['brandID'])) {
    $where[] = ' brandID =  ' . $mysqli->real_escape_string($_GET['brandID']);
}
if(!empty($_GET['gender'])) {
    $where[] = ' gender = ' . $mysqli->real_escape_string($_GET['gender']);
}
if(!empty($where)) {
    $query = $query . ' WHERE ' . implode(' and ', $where);
}
$result = $mysqli->query($query);

这也假设所有字段都是原始查询所用的整数。如果它们不是输入,则应该用单引号括起来。

$_GET['gender'] male / female应为:

if(!empty($_GET['gender'])) {
    $where[] = ' gender = \'' . $mysqli->real_escape_string($_GET['gender']) . "'";
}

因为没有引号,查询是

gender = male

无效。

gender = 'male'

是正确的查询。