Php 向这个更新函数添加变量where子句的正确方法是什么

Php 向这个更新函数添加变量where子句的正确方法是什么,php,mysqli,where-clause,Php,Mysqli,Where Clause,我用php制作了一个数据库类。现在我正在测试其中的更新功能。它返回语法错误或未知列错误,具体取决于where子句的形成方式 我试过: 'woord = \'uiteindelijk\'' and 'woord = \"uiteindelijk\"' and 'woord = "uiteindelijk"' and more 我还在de函数查询中尝试了不同的引号和反推,但它都给了我相同的错误 我的问题是,如果可能的话,形成where子句的正确方法是什么。如果不是的话,我该如何修复它 datab

我用php制作了一个数据库类。现在我正在测试其中的更新功能。它返回语法错误或未知列错误,具体取决于where子句的形成方式

我试过:

'woord = \'uiteindelijk\'' and 'woord = \"uiteindelijk\"' and 
'woord = "uiteindelijk"' and more
我还在de函数查询中尝试了不同的引号和反推,但它都给了我相同的错误

我的问题是,如果可能的话,形成where子句的正确方法是什么。如果不是的话,我该如何修复它

database.mysqli.php的一部分

<?php

class myDB {

    private $mysqli;

    public function __construct() {
        require_once('config.php');

        $this->mysqli = new mysqli(HOST, USERNAME, PASSWORD, DB_NAME);  
        if (mysqli_connect_errno()) {
            printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
        }
    }

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

    private function check($input) {
        if(is_string($input)) {
            $input = trim($input);
            return $this->mysqli->real_escape_string($input);   
        }       
        elseif(is_int($input)) {
            return $input;
        }
        elseif($input === true || $input === false) {
            return $input;
        }
        else {
            die('invalid input');
        }   
    }
    public function update($table, $data, $where) {
        $table = $this->check($table);
        $where = $this->check($where);
        $result = '';
        if (is_array($data)) {
            $update = array();
            foreach ($data as $key => $val) {
                $key = $this->check($key);
                $val = $this->check($val);  
                $update[] .= $key . '=\'' . $val . '\'';
            }
            $query = 'UPDATE ' . $table . ' SET ' . implode(',', $update) . ' WHERE ' . $where;
            if($this->mysqli->query($query)) {
                $result = 'Last updated row id is: '.$this->mysqli->insert_id;
            } 
            else {
                $result = $this->mysqli->error;
            }
        }   
        return $result;
    }

问题来自检查方法中的转义字符串。此函数用于转义语句中的精确部分,不能以这种通用方式将其作为一个整体应用于where子句

如果您确实知道您的输入是安全的(不包含破坏sql语句的特殊字符,无论是否恶意),那么只需删除转义

或者,如果出于充分的理由认为它们可能包含特殊字符,或者可能会拖拽sql注入,那么您必须提供一个更受约束的接口,以便您可以使用适当的转义自行构建where子句。例如:

public function update($table, $data, $woord) {
    ...
    $where = 'woord = \'' . $this->check($woord) . '\'';
    ...
}
编辑:我知道这听起来可能太拘束了,但安全是要付出代价的。对于更灵活的内容,您可以查看准备好的语句。它们允许您使用占位符,例如
WHERE woord=?和id<?
,您可以使用以下内容将其绑定到变量:

$stmt->bind_param('si', $woord, $id); // 'si' -> 1:string, 2:integer
在本例中,mysqli对绑定字符串应用内部转义,因此您不必担心它

请注意,不能使用占位符替换整个where子句<代码>何处?使用
$stmt->bind_参数('s',$WHERE)将不起作用


最后一件事,PDO,一种用PHP访问数据库的替代API,支持命名占位符(
其中woord=:woord
而不是
其中woord=?
).

在更新调用中,woord上缺少了一个结束符。此外,如果您想变得更加坚实,那么您不必通过逻辑连接where子句,您应该采用where KEY=VALUE的数组版本,但您还必须处理这些元素之间的逻辑门。e、 其中a=a和b=b或c=fw关于
(“galgje”,$data,“woord='uiteindelik'”)
@Scottzozer在woord上添加结束语没有意义。@Fred ii-我试过了,但它给出了一个语法错误:您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解第1行“\”uiteindelijk\”附近使用的正确语法。我想我已经在没有check函数的情况下尝试过了,但是我的where子句当时可能是错误的。我这样修正:$where='\''。$this->check($where)。'\'';现在可以使用如下函数:update('galgje',$data,'woord=“uiteindelik”')。现在的问题是,该函数始终返回上次更新的行id为:0,即使该单词已更新且不再是数据库。您尝试的修复将不起作用,它提供了有效的语法,但结果错误,因为现在您的$where变量被计算为原始字符串,转换为布尔值,在您的示例中为FALSE。使用
update('galgje',$data,'i am a teapot')会得到相同的结果(计算基于字符串的第一个字符)。是的,我认为这不是正确的方法。虽然如果我这样用的话,单词会变。我已经看过mysqli prepare了,但是没有考虑它的函数,因为您不知道需要绑定多少个参数以及什么类型的参数。
$stmt->bind_param('si', $woord, $id); // 'si' -> 1:string, 2:integer