Как использовать подготовленный и связанный оператор в запросе SQL - PullRequest
1 голос
/ 23 февраля 2011

Мне сказали, что мой запрос ниже очень чувствителен к SQL-инъекции - вместо этого я должен использовать связанные параметры,

class search
{

    public $mysqli = null;

    public function __construct($mysqli,$keyword = null)
    {
       $this->mysqli = $mysqli;
    }

    public function get_result($parameter)
    {
        $sql = "
        SELECT *
        FROM root_contacts_cfm
        WHERE root_contacts_cfm.cnt_id = '".$parameter."'
        ORDER BY cnt_id DESC
        ";

        $item = $this->mysqli->fetch_assoc($sql);
        return $item;
    }
}

Могу я спросить - как я могу превратить этот класс search вподготовленное и связанное заявление?

Я прочитал несколько статей в Интернете, почему мы должны использовать подготовленные заявления, статья 1 статья 2

Но я все ещеПонятия не имею, как улучшить свой запрос ... Я попытался с этой поправкой ниже,

class search
{

    public $mysqli = null;

    public function __construct($mysqli)
    {
       $this->mysqli = $mysqli;
    }

    public function get_result($parameter)
    {
        $sql = "
        SELECT *
        FROM root_contacts_cfm
        WHERE root_contacts_cfm.cnt_id = '?'
        ORDER BY cnt_id DESC
        ";

        $stmt = $this->mysqli->prepare($sql);

        /* bind parameters for markers */
        $stmt->bind_param("s", $parameter);

        /* execute query */
        $stmt->execute();

         /* fetch value */
        return $stmt->fetch();

    }
}

Поэтому, когда я вызываю класс поиска как объект,

$mysqli = new database(DB_HOST,DB_USER,DB_PASS,DB_NAME);
$output = new search($mysqli);
print_r($output->get_result('1'));

Я получу эту ошибку,

Предупреждение: mysqli_stmt :: bind_param () [mysqli-stmt.bind-param]: Количество переменных не соответствует количеству параметров в подготовленном выражении в C: \wamp \ www \ xxxl \ class_database.php в строке 487

, строка 487 относится к $stmt->bind_param("s", $parameter);

Спасибо.

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

Попробуйте удалить ', который окружает ваш ? заполнитель.

$sql = "
SELECT *
FROM root_contacts_cfm
WHERE root_contacts_cfm.cnt_id = ?
ORDER BY cnt_id DESC
";

В подготовленных выражениях все дело в том, чтобы указать тип параметра при его привязке, а не в SQL-запросе - что вы и сделали, когда написали '?'. Вы сказали, что это должна быть строка, но это не обязательно, когда вы связываете параметр как строку. Теперь движок базы данных узнает, как вставить / экранировать это значение.

0 голосов
/ 24 февраля 2011

это мое решение после поиска в Интернете:

class search
{
    public $mysqli = null;

    public function __construct($mysqli)
    {
       $this->mysqli = $mysqli;
    }

    public function get_result($parameter)
    {
        $sql = "
        SELECT *
        FROM root_contacts_cfm
        WHERE root_contacts_cfm.cnt_id = ?
        ORDER BY cnt_id DESC
        ";

        # create a prepared statement
        $stmt = $this->mysqli->prepare($sql);

        # bind parameters for markers
        $stmt->bind_param("s", $parameter);

        # execute query 
        $stmt->execute();



        /*
        # these lines of code below return multi-dimentional array, similar to mysqli::fetch_all()
        $stmt->store_result();

        $variables = array();
        $data = array();
        $meta = $stmt->result_metadata();

        while($field = $meta->fetch_field())
            $variables[] = &$data[$field->name]; // pass by reference

        call_user_func_array(array($stmt, 'bind_result'), $variables);

        $i=0;
        while($stmt->fetch())
        {
            $array[$i] = array();
            foreach($data as $k=>$v)
                $array[$i][$k] = $v;
            $i++;
        }

        return $array;
        */

        # these lines of code below return one dimentional array, similar to mysqli::fetch_assoc()
        $meta = $stmt->result_metadata(); 

        while ($field = $meta->fetch_field()) { 
            $var = $field->name; 
            $$var = null; 
            $parameters[$field->name] = &$$var; 
        }

        call_user_func_array(array($stmt, 'bind_result'), $parameters); 

        while($stmt->fetch()) 
        { 
            return $parameters;
            //print_r($parameters);      
        } 

        # the commented lines below will return values but not arrays
        # bind result variables
        //$stmt->bind_result($id); 

        # fetch value
        //$stmt->fetch(); 

        # return the value
        //return $id; 

        # close statement
        $stmt->close();
    }
}

не совсем понимаю, хотя ...

Мне сложно понять и попрактиковаться в подготовленном и связанном утверждении ... mysqli :: query () мне легче понять ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...