在我的页面中,我使用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']
时,它正在工作。
所以,当我直接赋予变量值时,它就可以正常工作,但是当我给变量而不是。为什么呢?
答案 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参数化查询。如果原始地址包含单引号,那么也会失败(结果未知)。这是一个痛苦的第一次,但它会在以后为您节省很多,使您的代码更容易阅读,并在这里得到更多的帮助(因为您的代码更容易阅读)。
答案 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
的帮助下进行纠正。
根据变量中trim()
的使用情况,您将获得此策略。
trim
- 从字符串的开头和结束中删除空格(或其他字符)
描述:此函数返回一个字符串,其中从str的开头和结尾剥去了空格。如果没有第二个参数,trim()将删除这些字符:
注意:强>
但是
trim()
会not remove
middle of the string
处的trim()
空格。
示例:强>
removes both
修剪字符串开头和结尾的字符,当从中间删除(或不删除)字符时,可能会造成混淆。修剪('abc','坏')trim('abc', 'b')
' a '和' b ',因为它修剪'a',从而将'b'移动到开头也被修剪。所以,这就是为什么它“有效”,而preg_replace()
似乎没有。
场景:因此,为了删除字符串中存在的所有空格,您必须使用以下内容。
3. You can directly adopt the method by strong the trimmed value into a variable and then echo it.
函数的帮助下删除字母数字和空格以外的所有字符。 preg_match
preg_match()
- 执行正则表达式匹配
描述:搜索主题与模式中给出的正则表达式匹配。
返回值: CTRL+U
如果模式与给定主题匹配则返回1,如果不匹配则返回0,如果发生错误则返回FALSE。
但是当我使用1934 Heron Ave Unit D Schaumburg IL 60193(这是我的变量值)而不是$ res ['propertyaddress']时,它正在工作。
原因:直接从数据库打印值时会发生此错误。
preg_replace("/(\W)+/", "", $word_to_undergo);
查看它,您将在看到它时看到它并且不建议使用它。因此,您必须删除或剥离参数,然后修剪。<强>查询:强>
\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)。