sql >> Databasteknik >  >> RDS >> Mysql

Jag har en rad heltal, hur använder jag var och en i en mysql-fråga (i php)?

Som med nästan alla "Hur gör jag SQL från PHP"-frågor - du verkligen bör använda förberedda uttalanden. Det är inte så svårt:

$ids  = array(2, 4, 6, 8);

// prepare an SQL statement with a single parameter placeholder
$sql  = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = ?";
$stmt = $mysqli->prepare($sql);

// bind a different value to the placeholder with each execution
for ($i = 0; $i < count($ids); $i++)
{
    $stmt->bind_param("i", $ids[$i]);
    $stmt->execute();
    echo "Updated record ID: $id\n";
}

// done
$stmt->close();

Alternativt kan du göra så här:

$ids    = array(2, 4, 6, 8);

// prepare an SQL statement with multiple parameter placeholders
$params = implode(",", array_fill(0, count($ids), "?"));
$sql    = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id IN ($params)";
$stmt   = $mysqli->prepare($sql);

// dynamic call of mysqli_stmt::bind_param                    hard-coded eqivalent
$types = str_repeat("i", count($ids));                        // "iiii"
$args = array_merge(array($types), $ids);                     // ["iiii", 2, 4, 6, 8]
call_user_func_array(array($stmt, 'bind_param'), ref($args)); // $stmt->bind_param("iiii", 2, 4, 6, 8)

// execute the query for all input values in one step
$stmt->execute();

// done
$stmt->close();
echo "Updated record IDs: " . implode("," $ids) ."\n";

// ----------------------------------------------------------------------------------
// helper function to turn an array of values into an array of value references
// necessary because mysqli_stmt::bind_param needs value refereces for no good reason
function ref($arr) {
    $refs = array();
    foreach ($arr as $key => $val) $refs[$key] = &$arr[$key];
    return $refs;
}

Lägg till fler parameterplatshållare för andra fält när du behöver dem.

Vilken att välja?

  • Den första varianten fungerar med ett variabelt antal poster iterativt och träffar databasen flera gånger. Detta är mest användbart för UPDATE- och INSERT-operationer.

  • Den andra varianten fungerar också med ett variabelt antal poster, men den träffar databasen bara en gång. Detta är mycket mer effektivt än det iterativa tillvägagångssättet, uppenbarligen kan du bara göra samma sak med alla berörda poster. Detta är mest användbart för SELECT- och DELETE-operationer, eller när du vill UPPDATERA flera poster med samma data.

Varför förberedda uttalanden?

  • Förberedda uttalanden är mycket säkrare eftersom de gör SQL-injektionsattacker omöjliga. Detta är den främsta anledningen till att använda förberedda uttalanden, även om det är mer jobb att skriva dem. En vettig vana att ta sig till är:Använd alltid förberedda uttalanden, även om du tycker att det "inte riktigt är nödvändigt". Vanvård kommer och biter dig (eller dina kunder).
  • Att återanvända samma förberedda sats flera gånger med olika parametervärden är effektivare än att skicka flera fullständiga SQL-strängar till databasen, eftersom databasen bara behöver kompilera satsen en gång och kan återanvända den också.
  • Endast parametervärden skickas till databasen på execute() , så mindre data behöver gå över tråden när den används upprepade gånger.

I längre loopar kommer exekveringstidsskillnaden mellan att använda en förberedd sats och att skicka vanlig SQL att bli märkbar.



  1. Hur installerar man localdb separat?

  2. Dataanslutningsändringar 2020.24

  3. DATEADD motsvarighet i PostgreSQL

  4. Är det möjligt att köra en textfil från SQL-fråga?