2016-09-23 55 views
4

在我的頁面我有這個代碼與回聲的。PHP查詢不能與變量

<?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行,但是,當我運行回顯查詢到數據庫它顯示1行。爲什麼?

我試過$res['propertyaddress']變量與trim()但沒有任何成功。

但是當我使用1934年鷺大道單位d紹姆堡IL 60193(這是我的變量值),而不是$res['propertyaddress']然後它的工作。

所以,當我直接給變量賦值的時候它正在工作,但是當我給變量的時候沒有。爲什麼?

+0

檢查您的日期格式'M-d-Y'應該是'Y-M-D'也許,對於'%關鍵字%' – devpro

+0

查詢工作,但不mysql_num_rows第二查詢支票($ resultdb)。 –

+0

你的查詢沒有返回任何內容,0條記錄。 echo $ query =「SELECT * FROM tenantmaster WHERE propertyaddress like'」。$ pdetail。「'」;' – devpro

回答

-2

您錯過了mysql_free_result($q);mysql_free_result($query)宣佈您已完成查詢。

and do更改爲mysqli(或PDO)。

6

比較多行字段中的文本輸入的一個常見問題是,您可能在第一個查詢的結果中包含「換行符」或「選項卡」,但這不在第二個查詢中。 (其他陷阱是「非破壞性空間」)。當您在HTML中回顯時,您將看不到輸出中的內容(因此複製和粘貼工作),但它們將用於查詢中(因此直接輸入失敗)。嘗試「查看源代碼」(顯示換行符)或在命令行運行,因爲這可能會給你更多的線索。

現在,去掉任何比字母數字等和空間使用preg_replace

$pdetail = trim(preg_replace("/[^0-9a-zA-Z ]/", "", $res['propertyaddress'])); 

最終你會要調整,要涵蓋所有用例,或者你會發現這是一個「換行」只是刪除那些 - 但你需要找到不同的東西。


而且,根據評論:檢查出mysqli/PDO參數化查詢。如果原始地址包含單引號,那也會失敗(結果未知)。這首先是一種痛苦,但它會在以後節省很多,使您的代碼更易於閱讀,並且在此處獲得更多幫助(因爲您的代碼更易於閱讀)。

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

+2

「在此獲得更多幫助」應該可以閱讀「在這裏減少*** *** ***」! – bishop

1

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

更改查詢

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

相反

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

使用

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

你會看到真正的變量值

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; 
?> 
0

請與此查詢嘗試。這將是讓你的結果

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

首先有幫助的,建議使用與準備好的聲明中沿mysqli,因爲它會避免將發生的SQL注入。現在你的代碼是純粹的注射劑,並且可以在mysqli的幫助下以及準備好的陳述或者在PDO的幫助下糾正。

  1. 的mysqli與預處理語句:http://php.net/manual/en/mysqli.prepare.php
  2. PDO:http://php.net/manual/en/book.pdo.php
  3. PDO與準備:http://php.net/manual/en/pdo.prepare.php

說明


按在U您的變量中的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()修剪從一開始和一個字符串的端部從中間刪除的字符,可能有混淆時字符(或不)。修剪('abc','壞')removes both'a'和'b',因爲它修剪'a',因此'b'移動到開始也被修剪。所以,這就是爲什麼它「有效」,而trim('abc', 'b')似乎沒有。

場景:因此,要刪除字符串中存在的所有白色空格,必須使用以下內容。

  1. 您必須首先使用preg_replace()函數刪除除字母數字和空格之外的所有字符。
  2. 在更換上述所有項目之後,您必須對變量進行修剪,以便它將刪除所有已存在的空格,因此您的字符串將看起來像您以硬代碼或直接提供的字符串。

3. You can directly adopt the method by strong the trimmed value into a variable and then echo it.

preg_match - 執行正則表達式匹配

描述:搜索主題的匹配來在圖案給出的正則表達式。

返回值:preg_match()如果模式與給定主題匹配,則返回1,否則返回0,如果發生錯誤,則返回FALSE。


解決您的問題


但是當我使用1934年鷺大道單位d紹姆堡IL 60193(這是我的變量值),而不是$水庫[ 'propertyaddress']那麼它的工作。

原因:當你直接從數據庫打印值,就會發生此錯誤。

  1. 如果您使用過任何編輯器,它會將內容直接作爲HTML標記單獨存儲到數據庫。
  2. 因此,爲了刪除HTML標籤,您必須首先將DB值存儲到變量中,方法是替換所有值,然後您必須顯示它。
  3. 如果您直接回顯,則不會看到HTML標籤,但如果您使用CTRL+U查看該標籤,則在看到它時會看到它,因此不推薦。因此你必須去掉或去掉的參數然後修剪吧。

查詢:

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

注:\W - 任何不是字母,數字或下劃線。

因此,就Unicode字符類而言,\W相當於不在LN字符類中且不是下劃線字符的每個字符。

替代解決方案:

要刪除只是把普通的空間變成你的性格類:

查詢:

$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; 
?>