PHP变量无法与查询配合使用

4
在我的页面中,我有这段带有echo的代码。
<?php

include("../config.php");

$q = mysql_query("SELECT propertyaddress FROM propertydetail WHERE active='yes' and leasedatefrom='".date("m-d-Y", strtotime('+1 months'))."'");
$res = mysql_fetch_array($q);
echo "<br/>pdetail=".$pdetail=trim($res['propertyaddress']);
echo $query="SELECT * FROM tenantmaster WHERE propertyaddress like '".$pdetail."'";
//echo $query="SELECT * FROM tenantmaster ";
//echo $query="SELECT * FROM tenantmaster WHERE propertyaddress = '1934 Heron Ave Unit D Schaumburg IL 60193'";

$resultdb = mysql_query($query);
if (!$resultdb) {
    die('Invalid query: ' . mysql_error());
}
else{
    echo "<br/>right query";
}

echo "<br/>num of row===".mysql_num_rows($resultdb);
$rowt = mysql_fetch_array($resultdb);
echo "<br/>row===".$rowt['name'];
exit;

?>

config.php

<?php

$mysql_hostname = "localhost";
$mysql_user = "root";
$mysql_password = "";
$mysql_database = "gms_estate";

/*
$mysql_hostname = "localhost";
$mysql_user = "root";
$mysql_password = "";
$mysql_database = "gms_estate";
*/

$bd = mysql_connect($mysql_hostname, $mysql_user, $mysql_password) 
or die("Opps some thing went wrong");
mysql_select_db($mysql_database, $bd) or die("Opps some thing went wrong");

?>

问题是我的第一个查询$q可以工作,但查询$query也可以工作,但mysql_num_rows($resultdb)不起作用,并显示0行,但是,当我将查询结果echo到数据库时,它显示1行。为什么?
我尝试使用trim()和变量$res['propertyaddress'],但没有成功。
但是当我使用1934 Heron Ave Unit D Schaumburg IL 60193(这是我的变量值)而不是$res['propertyaddress']时,它可以工作。
所以,当我直接给出变量的值时,它可以工作,但当我给出变量时,它不能工作。为什么?

请检查您的日期格式m-d-Y是否应该为Y-m-d,对于第二个查询,请使用%keywords%进行检查。 - devpro
查询可以工作,但是mysql_num_rows($resultdb)无法工作。 - Divyesh Jesadiya
它将显示SELECT * FROM tenantmaster WHERE propertyaddress = '1934 Heron Ave Unit D Schaumburg IL 60193',只是为了理解...所以,查询是正确的,但mysql_num_rows($resultdb)无法工作。 - Divyesh Jesadiya
3
你应该切换到mysqli和prepared statements或PDO,mysql已经过时。 - M. I.
6
不要使用mysql_*函数... - user1897253
显示剩余17条评论
7个回答

6
比较多行文本输入的常见问题是,您可能在第一个查询结果中有一个“换行符”或“制表符”,但在第二个查询结果中却没有。(其他陷阱是“不间断空格”)。
由于您正在HTML中回显,因此您在输出中看不到它们(因此复制和粘贴有效),但它们将用于查询(因此直接输入失败)。尝试“查看源代码”(显示换行符)或在命令行中运行,因为这可能会给您更多线索。
现在,使用preg_replace删除除字母数字和空格之外的任何内容。
$pdetail = trim( preg_replace("/[^0-9a-zA-Z ]/", "", $res['propertyaddress']) );

最终您将希望调整它以包含所有用例,或者如果发现它是“换行符”,则只需删除它们 - 但您需要找出不同之处。
另外,根据评论:请查看mysqli / PDO参数化查询。 如果原始地址包含单引号,则也会失败(结果未知)。 首先很麻烦,但以后将为您节省很多时间,使您的代码更易于阅读,并且在SO上获得更多帮助(因为您的代码更易于阅读)。

http://php.net/manual/en/pdo.prepared-statements.php


2
在这里获得更多的帮助,可能应该理解为“在SO社区不要受到太多指责”! - bishop

2
<?php
    include("../config.php");

    $connect = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_database", $mysql_user, $mysql_password);

    $q = "SELECT propertyaddress FROM propertydetail WHERE active='yes' and leasedatefrom='".date("m-d-Y", strtotime('+1 months'))."'";
    $result = $connect->prepare($q);
    $status = $result->execute();
    $res = $result->fetch(PDO::FETCH_ASSOC);
    $pdetail = $res["propertyaddress"];

    $q = "SELECT * FROM tenantmaster WHERE propertyaddress = ".$connect->quote($pdetail);
    /* or
    $q = "SELECT * FROM tenantmaster WHERE propertyaddress like ".$connect->quote($pdetail);
    */
    $result = $connect->prepare($q);
    $status = $result->execute();

    echo "<br/>num of row===".$result->rowCount();

    if (($status) && ($result->rowCount() > 0))
    {
        $res = $result->fetch(PDO::FETCH_ASSOC);
        echo "<br/>row===".$res['name'];
    }

    $connect = null;
?>

2
首先建议使用mysqli和预处理语句,因为这将避免发生SQL注入。现在你的代码是纯可注入的,可以通过mysqli和预处理语句或PDO来纠正。
  1. Mysqli with Prepared Statement: http://php.net/manual/en/mysqli.prepare.php
  2. PDO: http://php.net/manual/en/book.pdo.php
  3. PDO with Prepared: http://php.net/manual/en/pdo.prepare.php

解释


根据你在变量中使用trim(),你将仅按照此方法进行策略。 trim - 从字符串开头结尾去除空格(或其他字符) 描述:此函数返回从字符串开头和结尾去除空格后的字符串。如果没有第二个参数,则trim()将去除以下字符:
  • " "(ASCII 32(0x20),普通空格)。
  • "\t"(ASCII 9(0x09),制表符)。
  • "\n"(ASCII 10(0x0A),换行符)。
  • "\r"(ASCII 13(0x0D),回车符)。
  • "\0"(ASCII 0(0x00),NUL字节)。
  • "\x0B"(ASCII 11(0x0B),垂直制表符)。
注意:

但是,trim()不会删除给定字符串中间的空格。

示例: trim()从字符串的开头和结尾修剪字符,当字符被(或未被)从中间删除时,可能会令人困惑。trim('abc', 'bad') 同时删除'a'和'b',因为它修剪'a',因此将'b'移动到开头也被修剪。因此,这就是为什么它“有效”,而trim('abc', 'b')似乎不起作用的原因。 场景:因此,为了删除字符串中存在的所有空格,您必须使用以下方法。
  1. 您需要使用preg_replace()函数将所有非字母数字和空格字符替换掉。
  2. 替换完上述内容后,您需要对变量进行修剪,以便删除其中出现的所有空格,并使您的字符串看起来像硬编码或直接输入的字符串。

3. 您可以通过将修剪后的值存储到一个变量中,然后输出它来直接采用这种方法。

preg_match - 执行正则表达式匹配

描述: 在主体中搜索与模式中给定的正则表达式匹配的项。

返回值: 如果模式与给定主题匹配,则preg_match()返回1,否则返回0,如果发生错误,则返回FALSE。


解决方案


但是当我使用1934 Heron Ave Unit D Schaumburg IL 60193(这是我的变量值),而不是$res ['propertyaddress']时,它可以正常工作。

原因: 当您直接从数据库打印值时,就会发生此错误。

  1. 如果您使用了任何编辑器,它将仅将内容直接存储到数据库中作为HTML标记。
  2. 因此,为了删除HTML标记,您必须先将DB值替换为变量,然后再显示它。
  3. 如果您直接输出它,则看不到HTML标记,但是如果使用CTRL+U查看它,您将在其中看到它,这是不推荐的。因此,您必须删除或剥离参数,然后修剪它。

查询:

preg_replace("/(\W)+/", "", $word_to_undergo);

注意:\W - 任何不是字母、数字或下划线的字符。
因此,在Unicode字符类方面,\W等同于所有不在L或N字符类中且不是下划线字符的字符。
替代解决方案:
只需将一个普通空格放入您的字符类中即可删除。
查询:
$needed_text = preg_replace("/[^A-Za-z0-9 ]/", "", $word_to_undergo);

除了以上解决方案,您还需要执行修剪操作,以生成符合您要求的完美字符串,并与查询匹配并产生结果。

根据建议一:应该是这样的

$final_value = preg_replace("/(\W)+/", "", $word_to_undergo);
$final_value = preg_replace("/(\W)+/", "", $res['propertyaddress']);

根据建议二:应该是
$final_value = preg_replace("/[^A-Za-z0-9 ]/", "", $word_to_undergo);
$final_value = preg_replace("/[^A-Za-z0-9 ]/", "", $res['propertyaddress']);

除了上述解决方案外,您可以尝试像这样使用。
<?php
$display=trim($res['propertyaddress']);
echo $display; 
?>

1

相反

echo "<br/>pdetail=".$pdetail=trim($res['propertyaddress']);

使用

$pdetail=trim($res['propertyaddress']);
echo "<br/><pre>pdetail='".$pdetail."'</pre>";

你将能够看到实际的变量值


1
将您的查询从

更改为


echo $query="SELECT * FROM tenantmaster WHERE propertyaddress like '".$pdetail."'";

echo $query="SELECT * FROM tenantmaster WHERE propertyaddress like '%".$pdetail."'%";

0

请尝试使用此查询。它将有助于获得您的结果。

$query='SELECT * FROM tenantmaster WHERE propertyaddress like "'.$pdetail.'";

-2

你缺少了 mysql_free_result($q);mysql_free_result($query) 来宣布你已经完成了查询。

而且,务必改用mysqli(或PDO)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接