PHP中的转义字符串

PHP中的转义字符串,php,escaping,Php,Escaping,此代码段在使用撇号访问数据库条目之前工作正常。我明白我需要在拔出它们后逃离它们。作为PHP新手,我不知道如何处理所有关于PDO和“->”以及mysqli_real_escape_string()的信息。这一切让我有点困惑。如何转义$team1rows和$team2rows,以便将它们传递回我的页面?谢谢 $team1rows = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM $page WHERE vote = '$team1'"

此代码段在使用撇号访问数据库条目之前工作正常。我明白我需要在拔出它们后逃离它们。作为PHP新手,我不知道如何处理所有关于PDO和“->”以及mysqli_real_escape_string()的信息。这一切让我有点困惑。如何转义$team1rows和$team2rows,以便将它们传递回我的页面?谢谢

$team1rows = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM $page WHERE vote = '$team1'"));
$team2rows = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM $page WHERE vote = '$team2'"));

echo $team1rows . "|" . $team2rows;

echo在遇到撇号之前工作正常。

使用PDO,如果使用正确,prepare语句将阻止SQL注入。mysqli_查询是不应该再使用的旧方法。请参见下面列出的示例:

<?php
$pdo = new PDO('sqlite:users.db');
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); // <-- Automatically sanitized by PDO
$stmt->execute();
tldr。这将消除所有查询,包括数据包含撇号时意外中断的查询

因为,没有必要切换到PDO!虽然我建议使用mysqli对象API,但我还是将代码保留在非OOP mysqli语法中。下面的代码不执行任何“转义”-如果这样做了,它只是一个实现细节

# Create prepared statement, bind parameters - no apostrophe-induced error!
# - With placeholders there is need to worry about quoting at all
# - I recommend explicitly selecting columns
# - $page is NOT data in the query and cannot be bound in a placeholder
$stmt = mysqli_prepare($connection, "SELECT * FROM $page WHERE vote = ?");
mysqli_stmt_bind_param($stmt, "s", $vote);

# Execute prepared statement
$result = mysqli_stmt_execute($stmt);

# Use results somehow;
# Make sure check $result/execution for errors!
# (PDO is nice because it allows escalation of query errors to exceptions.)
$count = mysqli_num_rows($result);
现在,如上所述,$page不能绑定在占位符中,因为它与查询形状相关,但不是数据。处理这种特殊情况的一种可接受的方法——如果不重新设计模式的话——是。比如说,

$approvedPages = array("people", "tools", "pageX");
if (!in_array($page, $approvedPages)) {
   # Wasn't a known page - might have been something mischievous!
   # Choose default approved page or throw error or something.
   $page = $approvedPages[0];
}

我知道我做错了什么。我犯了一个业余的错误。我试图逃避查询的结果。但在这种情况下,结果是行数。所以逃避结果不是问题,因为它只是一个数字。我很困惑,因为那个数字与一个有撇号的值相关联。我认为查询中使用的字符串没有被转义,这导致它失败,而不是结果

因此,通过首先像这样转义我在查询中使用的变量

$page = mysqli_real_escape_string($connection, $page);
$team1 = mysqli_real_escape_string($connection, $team1);
$team2 = mysqli_real_escape_string($connection, $team2);
这为我提供了用于以下查询的好字符串

$team1number = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM $page WHERE vote = '$team1'"));
$team2number = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM $page WHERE vote = '$team2'"));

echo $team1number . "|" . $team2number;

再一次,我把一切都颠倒过来,试图逃避结果。Noob是我的一员,但由于这一发现,我学到了很多。谢谢大家。

PDO准备好的语句:,mysqli_real_escape_string():mysqli准备好的语句:随机教程:您是如何得出这个乏味的mysqli escape函数与PDO有关的结论的?你读了哪本手册或教程?@Tom谢谢你的链接。听起来好像有更好的方法可以做到这一点,但我几乎完成了thsi项目,所以我不想重新开始。从链接中,我尝试了以下内容,但没有成功$team1number=mysqli\u real\u escape\u字符串($connection,$team1rows);可能的重复(如果您不想切换到PDO,请参阅mysqli相关信息),听起来如果我想切换到PDO,我需要重新开始。不幸的是,我下面的教程没有使用它,我几乎坚持不下去。下一个项目的PDO更有可能,谢谢你的推动。同时,$team1number=mysqli\u real\u escape\u string($connection,$team1rows);也不起作用。@Layne我同意现在不切换到PDO(虽然我建议在新项目中使用),但mysqli也支持预先准备好的语句,只需要对要使用的查询进行最小的更改。起动器