Php 在关联数组中使用LIKE和通配符进行SQL注入验证选择

Php 在关联数组中使用LIKE和通配符进行SQL注入验证选择,php,mysql,mysqli,pdo,Php,Mysql,Mysqli,Pdo,该计划是创建一个面向公众的互联网服务,可以从数据库中自动完成单词。我使用一个常规的mysql查询成功地运行了它,但我很担心,因为我将把这个连接包含到wordpress插件中,这将使我的服务器容易受到攻击 我在MYSQL中创建了一个新用户,在这个表上只有select权限,所以我不担心在脚本中泄露密码,因为我相信这将有助于调试。有各种各样的回声等,我放在那里调试的目的。最终,它的输出将进入一个Json文件,并由jQueryUIAutoComplete检索 从本质上讲,我遇到的问题是无法让查询工作。我

该计划是创建一个面向公众的互联网服务,可以从数据库中自动完成单词。我使用一个常规的mysql查询成功地运行了它,但我很担心,因为我将把这个连接包含到wordpress插件中,这将使我的服务器容易受到攻击

我在MYSQL中创建了一个新用户,在这个表上只有select权限,所以我不担心在脚本中泄露密码,因为我相信这将有助于调试。有各种各样的回声等,我放在那里调试的目的。最终,它的输出将进入一个Json文件,并由jQueryUIAutoComplete检索

从本质上讲,我遇到的问题是无法让查询工作。我试图一行一行地添加代码,但连接不起作用。可以在mysql workbench上测试凭据,IP地址是46.101.8.220。使调试更加困难的是,代码中有人在从web浏览器查看时阻止页面输出上出现任何内容。我花了很多时间尝试Mysqli、PDO、面向对象和过程化,希望能得到任何帮助,我将不胜感激

$term = isset($_GET['term']) ? $_GET['term'] . '%': 'test%';
echo $term;

$conn = new mysqli('localhost', 'search-words','','admin_soup');
print ($conn ? 'connected' : 'cant con');
$query = 'SELECT id as value, word as label FROM word where word LIKE ?;';
    $stmt = $conn->prepare($query);
    $stmt->bind_param("s", $term)
    if ($stmt->execute()){
        $result = $stmt->get_result();
        while($row = $result->fetch_array(MYSQLI_ASSOC)){
            $row_set[] = $row;
        }
    }
echo json_encode($row_set);//format the array into json data
$stmt->close();
$conn->close();
print_r($row_set);
在第一次通知后,代码更改为并开始工作。谢谢

$term = isset($_GET['term']) ? $_GET['term'] . '%': 'test%';
echo $term;
$conn = new mysqli('localhost', 'search-words','','admin_soup');
print ($conn ? 'connected' : 'cant con');
$query = 'SELECT id as value, word as label FROM word where word LIKE ?;';
    $stmt = $conn->prepare($query);
    $stmt->bind_param("s", $term);
    if ($stmt->execute()){
        $stmt->bind_result($value,$label);
        while($row = $stmt->fetch()){
            $row_set[] = array('value'=>$value, 'label'=>$label);
        }
    }

echo json_encode($row_set);//format the array into json data
$stmt->close();
$conn->close();
代码仍然没有返回任何内容。仔细检查用户信息。在测试sql语句时,我唯一需要更改的是,我需要在“test%”周围添加引号,但我认为bind_参数不需要引号。如果我删除$query downwars中的所有代码,如果我再次在下面添加,它将在屏幕上显示已连接的消息。屏幕上什么也没显示

我的服务器上是否有需要更新的内容

$stmt->bind_param("s", $term)
失踪”

get\u result()
方法并非始终可用。检查php.net:

仅适用于mysqlnd

这就是为什么pdo更方便的原因之一

但是我想您可以使用
bind\u result()
然后
fetch()
如示例所示的数据

通过使用PDO,代码可以如下所示:

$stmt = $dbh->prepare('SELECT id as value, word as label FROM word where word LIKE ?');
$stmt->execute(array($term));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

我尝试了mysqli解决方案,但仍然一无所获,我用一些新的想法更新了这个问题。我开始怀疑这是否与代码无关。@stephenmcraughlin
$row\u set[]=array('value'=>$value,'label'=>$label)
缺失;再说一次,看不见森林的树木:'(
if ($stmt->execute()){
    $stmt->bind_result($value, $label);
    while($row = $stmt->fetch()){
        $row_set[] = array('value' => $value, 'label' => $label);
    }
}
$stmt = $dbh->prepare('SELECT id as value, word as label FROM word where word LIKE ?');
$stmt->execute(array($term));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);