PHP查询无法使用变量

时间:2016-09-23 13:50:53

标签: php mysql

在我的页面中,我使用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行。为什么呢?

我使用$res['propertyaddress']尝试trim()变量,但没有成功。

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

所以,当我直接赋予变量值时,它就可以正常工作,但是当我给变量而不是。为什么呢?

7 个答案:

答案 0 :(得分:6)

比较多行字段中的文本条目的一个常见问题是您可能有一个&#34;换行符&#34;或&#34; tab&#34;在第一个查询的结果中,但不在第二个查询中。 (其他问题是&#34;不间断的空间&#34;)。

当您在HTML中回显时,您不会在输出中看到那些(因此复制和粘贴工作),但它们将在查询中使用(因此直接输入失败)。尝试&#34;查看来源&#34; (显示换行符)或在命令行中运行,因为这可能会为您提供更多线索。

现在,使用preg_replace

删除除字母数字和空格以外的任何内容
$pdetail = trim( preg_replace("/[^0-9a-zA-Z ]/", "", $res['propertyaddress']) );

最终,您需要对其进行调整,以涵盖您的所有用例,或者您发现它是&#34;换行符&#34;只是删除那些 - 但你需要找到与众不同的东西。

并且,根据评论:查看mysqli / PDO参数化查询。如果原始地址包含单引号,那么也会失败(结果未知)。这是一个痛苦的第一次,但它会在以后为您节省很多,使您的代码更容易阅读,并在这里得到更多的帮助(因为您的代码更容易阅读)。

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

答案 1 :(得分: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 :(得分: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
  4. 说明

    根据变量中trim()的使用情况,您将获得此策略。

    trim - 从字符串的开头结束中删除空格(或其他字符)

    描述:此函数返回一个字符串,其中从str的开头和结尾剥去了空格。如果没有第二个参数,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()not remove middle of the string处的trim()空格。

    示例:

    removes both修剪字符串开头和结尾的字符,当从中间删除(或不删除)字符时,可能会造成混淆。修剪('abc','坏')trim('abc', 'b')' a '和' b ',因为它修剪'a',从而将'b'移动到开头也被修剪。所以,这就是为什么它“有效”,而preg_replace()似乎没有。

    场景:因此,为了删除字符串中存在的所有空格,您必须使用以下内容。

    1. 您必须首先在3. You can directly adopt the method by strong the trimmed value into a variable and then echo it.函数的帮助下删除字母数字和空格以外的所有字符。
    2. 在替换所有上述项目之后,您必须修改变量,以便它将删除所有存在的空格,因此您的字符串将看起来像您在硬编码中直接提供的字符串。 / LI>

      preg_match

      preg_match() - 执行正则表达式匹配

      描述:搜索主题与模式中给出的正则表达式匹配。

      返回值: CTRL+U如果模式与给定主题匹配则返回1,如果不匹配则返回0,如果发生错误则返回FALSE。

      您的问题的解决方案

        

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

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

      1. 如果您使用过任何编辑器,它会直接将内容作为HTML标记存储到数据库中。
      2. 因此,为了删除HTML标记,您首先通过替换所有值将DB值存储到变量中,然后必须显示它。
      3. 如果您直接回复它,您将看不到HTML标记,但如果您使用preg_replace("/(\W)+/", "", $word_to_undergo); 查看它,您将在看到它时看到它并且不建议使用它。因此,您必须删除或剥离参数,然后修剪
      4. <强>查询:

        \W

        注意: \W - 任何不是字母,数字或下划线的内容。

        因此,就Unicode字符类而言,L等同于不在N$needed_text = preg_replace("/[^A-Za-z0-9 ]/", "", $word_to_undergo); 字符类中且不是下划线字符的每个字符。< / p>

        替代解决方案:

        要删除只是在您的角色类中放置一个空格:

        <强>查询:

        $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}}

答案 3 :(得分:1)

更改您的查询
echo $query="SELECT * FROM tenantmaster WHERE propertyaddress like '".$pdetail."'";

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

答案 4 :(得分:1)

相反

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

使用

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

你可以看到真正的变量值

答案 5 :(得分:0)

请尝试使用此查询。获得结果会很有帮助

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

答案 6 :(得分:-2)

您遗漏了mysql_free_result($q);mysql_free_result($query),宣布您已完成查询。

更改为mysqli(或PDO)。