Php 在mysqli_结果中接收内容

Php 在mysqli_结果中接收内容,php,mysql,database,Php,Mysql,Database,我正试图将这段代码从Java复制到php中,但我不知道如何获取行/列的内容 这是java代码: ResultSet resultsRS = statement.executeQuery("select distinct snum from shipments where quantity >= 100"); int rowCount=0; while(resultsRS.next()){ statement2.executeUpdate("UPDATE suppliers SE

我正试图将这段代码从Java复制到php中,但我不知道如何获取行/列的内容

这是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++;
   }                            
}

您应该阅读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();
?>


中,您可以在php.net网站上阅读它()
mysqli_查询
返回一个
mysqli_结果
对象()

您必须使用
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++;
}
处理这种情况的“最佳实践”解决方案是首先在循环外部“准备”查询,然后在循环期间将参数绑定到查询。这避免了SQL注入;虽然在这种特定情况下,这可能不是一个问题,但最好不要直接在查询中注入数据,而是始终使用参数绑定。它看起来也更漂亮,更容易理解,没有那些引用的废话:)

您可能还希望通过首先收集所有ID,然后为整批ID发出一条update语句来优化这一点


此外,我希望您能够使用单个查询完成此操作,对连接执行更新。。。因此,如果性能是一个考虑因素,那么您可能也需要考虑这一点。

实际上,文档中指出,自PHP5.4以来,mysqli_查询返回的mysqli_结果对象实现了可遍历接口,因此可以直接对其进行迭代。我也对询问者的代码感到惊讶,但现在它似乎确实有效。哦,我明白了,很高兴知道这一点。虽然在工作中我们被5.3困住了,也许这就是为什么我错过了。但在任何情况下,我想你们还是要把它当作一个列的集合。因此,您必须使用
$shipping['snum']
而不是简单地使用
$shipping
。's'在bind_参数中是什么意思?我从代码中得到的也是“对非对象调用成员函数bind_param()”。第一个参数指示您绑定的参数的类型。S代表字符串,i代表整数。既然你在sNum周围加了引号,我就把它绑定成一个字符串。。。整数可能更有意义。这就是我没有在本地mysqli连接上尝试它的原因。我已经用错误处理更新了代码示例,这样您就可以看到哪里出了问题。啊,很好,谢谢。最后一个问题。bind_param实际上会包含带引号的字符串吗?例如,在where snum=“where”中创建查询
$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++;
}