2013-05-31 230 views
0

我有一些PHP/SQL寫入來填充選擇列表與數據庫中的數據與選項填充基於文本框中的先前輸入$ pk完全接受,是一個有效的ARTICLE_NO ,並且查詢在由mysql直接執行時完美工作。我已經把輸出語句放在每個事件之後,並且除了執行之外的所有事件。 while循環從不輸入,我不確定原因。這裏是我的代碼:語句導致while循環錯誤

編輯:我已經縮小了問題的事實,即返回0行,但我不知道爲什麼,因爲在phpmyadmin相同的查詢給出正確的結果。

if (!$getRecords->fetch()) { 
    printf("<p>ErrorNumber: %d\n", $getRecords->errno); 
} 

它表明錯誤號是0,所以沒有記錄被取出,並沒有錯誤,但它是一個有效的查詢。

<?php 
ini_set('display_errors', '1'); 
error_reporting(E_ALL); 
$pk = $_GET["pk"]; 
$con = mysqli_connect("localhost", "", "", ""); 
if (!$con) { 
    echo "Can't connect to MySQL Server. Errorcode: %s\n". mysqli_connect_error(); 
    exit; 
} 
$con->set_charset("utf8"); 
echo "test outside loop"; 
if(1 < 2) { 
    echo "test inside loop"; 
    $query1 = 'SELECT ARTICLE_NO FROM AUCTIONS WHERE ARTICLE_NO = ?'; 
    if ($getRecords = $con->prepare($query1)) { 
echo "inside second loop"; 
     $getRecords->bind_param("i", $pk); 
echo "test after bind param"; 
     $getRecords->execute(); 
echo "test after bind execute"; 
     $getRecords->bind_result($ARTICLE_NO); 
echo "test after bind result"; 
     while ($getRecords->fetch()) { 
      echo "test inside while"; 
      echo "<h1>".$ARTICLE_NO."</h1>"; 
     } 
    } 
} 

編輯:

我試着用這個代碼:

<?php 
$mysqli = new mysqli("localhost", "", "", ""); 
$pk = $_GET["pk"]; 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 
/* prepare statement */ 
if ($stmt = $mysqli->prepare("SELECT ARTICLE_NAME, WATCH FROM AUCTIONS WHERE ARTICLE_NO = ? LIMIT 5")) { 
    $stmt->bind_param("i", $pk); 
    $stmt->execute(); 
    /* bind variables to prepared statement */ 
    $stmt->bind_result($col1, $col2); 
    /* fetch values */ 
    while ($stmt->fetch()) { 
     printf("%s %s\n", $col1, $col2); 
    } 
    /* close statement */ 
    $stmt->close(); 
} 
/* close connection */ 
$mysqli->close(); 
?> 

此作品,未經$ PK,如果我拿走它工作正常的參數。通過GET獲取pk不是問題,因爲如果我分配$ pk = 1;相反,它仍然失敗。

編輯:問題是,mysqli無法處理bigint,我現在使用k作爲字符串,它工作正常。

回答

0

我注意到的第一件事是數據庫的名稱。這應該是一個字符串「twa312」,我也把爲$ _ POST檢查[「後」]檢查下面的代碼:

<?php 

    $conn = mysql_connect("localhost", "*****", "*****"); 
    mysql_select_db('twa312', $conn) 
    or die ('Database not found ' . mysql_error()); 

    $options = '<option value="0"></option>'; 
    if(isset($_POST['post'])) 
    { 
     $postcode = $_POST["post"]; 


    $sql = "SELECT school_info.Name AS Name, local_schools.postcodeID AS postcode FROM school_info INNER JOIN local_schools ON local_schools.schoolID = school_info.schoolID"; 
    $sql = $sql . " where postcode = '$postcode' "; 

    $rs = mysql_query($sql, $conn) 
    or die ('Problem with query' . mysql_error()); 

    while ($row=mysql_fetch_array($rs)) { 
    $name=$row["Name"]; 
    $options .= '<OPTION VALUE="' . $name . '">' . $name ."</option>"; 
    } 
} 
else 
{ 
$options = ''; 
} 

    ?> 

您還沒有定義$ msgp變量。

希望它可以幫助你,隨時問我任何其他問題,並張貼你的錯誤。

+0

我怎麼會做這麼代碼時,郵編已經進入了只執行? – AJJ

+0

放一個,如果在開始時: 如果(isset($ _ POST [「後」]))從數據庫 –

+0

開始檢索數據謝謝你,沒有更多的服務器錯誤,現在我只是想獲得的代碼做我也需要它 – AJJ

0

像這樣的東西應該工作。您的查詢中沒有包含valid_postcodes表,因此服務器與一個不存在的字段混淆。

if (isset($postcode) && !empty($postcode)) { 
$sql = "SELECT school_info.Name AS Name, local_schools.postcodeID AS postcode FROM school_info INNER JOIN local_schools ON local_schools.schoolID = school_info.schoolID"; 
$sql .= " JOIN valid_postcodes ON local_schools.postcodeID = valid_postcodes.id "; 
$sql .= " where postcode = '$postcode' "; 

$rs = mysql_query($sql, $conn) 
or die ('Problem with query' . mysql_error()); 

while ($row=mysql_fetch_array($rs)) { 
    $name=$row["Name"]; 
    $options .= '<OPTION VALUE="' . $name . '">' . $name ."</option>"; 
} 
} 

此外,您可以通過確保查詢只在知道變量中存在值時運行,從而減少發生錯誤的可能性。並且通過使用PHP的.=並置來減少您必須寫出變量名稱的次數。

檢查返回數組,像這樣:

$rs = mysql_query($sql, $conn) 
or die ('Problem with query' . mysql_error()); 

echo "<pre>"; 
print_r(mysql_fetch_assoc($rs)); 
echo "</pre>"; 

while ($row=mysql_fetch_array($rs)) { 
+0

啊是的這就是我想問的,我將如何使它查詢只有在輸入值時才運行? – AJJ

+0

我通過用if語句包圍整個塊來實現這一點,該語句檢查以確保'$ postcode'有一個值。 – ahwm

+0

幸運地使用這個之後,不再有服務器錯誤,但代碼似乎沒有工作,當我輸入有效的郵政編碼時,選擇列表不會被任何東西填充。 – AJJ