2013-08-02 23 views
0

我想從Java複製這段代碼到PHP,但我不能完全弄清楚如何獲得行/列的內容?在mysqli_result接收內容

這是java代碼:

ResultSet resultsRS = statement.executeQuery("select distinct snum from shipments where quantity >= 100"); 

int rowCount=0; 

while(resultsRS.next()){ 
    statement2.executeUpdate("UPDATE suppliers SET status = status + 5 WHERE snum = "+"\""+resultsRS.getString(1)+"\""); 
    rowCount++; 
} 

到目前爲止,我有這個在PHP:

$result2 = mysqli_query($database,"select distinct snum from shipments where quantity >= 100"); 

$rowCount = 0; 

foreach($result2 as $shipment){ 
    mysqli_query($database,"UPDATE suppliers SET status = status + 5 WHERE snum = "."\"".$shipment."\""); 
    rowCount++; 
} 

如同預期這是行不通的。

另外如果你注意到我想要的只是一個特定的列來更新。

編輯:得到它的工作

對於大家閱讀我能得到我想要用下面的代碼:

for($counter=0; $row = mysqli_fetch_row($result2);$counter++){    
    foreach($row as $key=> $value){ 
     mysqli_query($database,"UPDATE suppliers SET status = status + 5 WHERE snum = "."\"".$value."\""); 
     $rowCount++; 
    }        
} 

回答

1

你應該閱讀PHP的mysqli文檔:

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5"; 

if ($result = $mysqli->query($query)) { 

    /* fetch associative array */ 
    while ($row = $result->fetch_assoc()) { 
     printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]); 
    } 

    /* free result set */ 
    $result->free(); 
} 

/* close connection */ 
$mysqli->close(); 
?> 

Mysqli fetch

1

正如你可以閱讀它的php.n et站點(http://php.net/manual/en/mysqli.query.phpmysqli_query返回mysqli_result對象(http://www.php.net/manual/en/class.mysqli-result.php)。

您必須從fetch_*函數之一中獲取結果中的行。

例如:

$result2 = mysqli_query($database,"select distinct snum from shipments where quantity >= 100"); 

$rowCount = 0; 

while($shipment = $result2->fetch_assoc()){ 
    mysqli_query($database,"UPDATE suppliers SET status = status + 5 WHERE snum = "."\"".$shipment['snum']."\""); 
    rowCount++; 
} 
+0

實際上,文檔指出,自PHP 5.4以來,mysqli_query返回的mysqli_result對象實現了Traversable接口,因此可以直接迭代。我也在提問者的代碼中喋喋不休,但它現在看起來確實有效。 – kander

+0

哦,我明白了,很高興知道這一點。雖然在工作中我們堅持5.3,也許這就是我錯過的原因。但無論如何,我想你仍然必須把它當作一個列的集合。所以你必須使用'$ shipment ['snum']'而不是簡單地'$ shipment'。 – fejese

0

「最佳實踐」解決方案來處理這種情況是,首先「準備」查詢時,環路的外部,那麼在循環過程的參數綁定到它。這避免了SQL注入;儘管在這個特定情況下這可能不是問題,但仍然可以考慮不直接在查詢中注入數據,而是始終使用參數綁定。它還看起來要好很多,更容易理解,沒有所有的報價廢話:)

$result2 = mysqli_query($database,"select distinct snum from shipments where quantity >= 100"); 
$query = mysqli_prepare($database, 'UPDATE suppliers SET status = status + 5 WHERE snum = ?'); 
// Check for errors. This is obviously not the right way to handle this when going into production... 
if(!$query) { 
    var_dump(mysqli_error($database)); 
    die(); 
} 
foreach($result2 as $shipment){ 
    $snum = $shipment['snum']; 
    $query->bind_param('s', $snum); 
    $query->execute(); 
    $rowCount++; 
} 

您可能還需要先收集所有的ID,以優化這個,然後發出整批的一個更新語句標識。此外,我期望您能夠使用單個查詢來執行此操作,對連接執行更新...因此,如果性能有任何考慮,您可能還需要考慮這一點。

+0

's'在bind_param裏是什麼意思? –

+0

另外,我從代碼中得到的是「調用成員函數bind_param()在非對象」 –

+0

第一個參數指示您要綁定的參數的類型。 S代表字符串,i代表整數。既然你是在sNum上引用引號,我已經把它作爲一個字符串來綁定......可能整數更有意義。 – kander