sql >> Database teknologi >  >> RDS >> Mysql

Jeg har en række heltal, hvordan bruger jeg hver enkelt i en mysql-forespørgsel (i php)?

Som med næsten alle "Hvordan laver jeg SQL fra PHP"-spørgsmål - du virkelig skal bruge udarbejdede udsagn. Det er ikke 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øre det sådan her:

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

Tilføj flere parameterpladsholdere til andre felter, efterhånden som du har brug for dem.

Hvilken skal du vælge?

  • Den første variant fungerer med et variabelt antal poster iterativt og rammer databasen flere gange. Dette er mest nyttigt til OPDATERING og INSERT operationer.

  • Den anden variant fungerer også med et variabelt antal poster, men den rammer kun databasen én gang. Dette er meget mere effektivt end den iterative tilgang, selvfølgelig kan du kun gøre det samme med alle berørte poster. Dette er mest nyttigt til SELECT og DELETE operationer, eller når du vil OPDATERE flere poster med de samme data.

Hvorfor udarbejdede erklæringer?

  • Forberedte sætninger er meget sikrere, fordi de gør SQL-injektionsangreb umulige. Dette er den primære grund til at bruge forberedte udsagn, selvom det er mere arbejde at skrive dem. En fornuftig vane at komme ind i er:Brug altid forberedte udsagn, selvom du synes, det "ikke egentlig er nødvendigt." Forsømmelse vil komme og bide dig (eller dine kunder).
  • Genbrug af den samme forberedte sætning flere gange med forskellige parameterværdier er mere effektiv end at sende flere fulde SQL-strenge til databasen, fordi databasen kun behøver at kompilere sætningen én gang og også kan genbruge den.
  • Kun parameterværdier sendes til databasen på execute() , så mindre data skal gå over ledningen, når de bruges gentagne gange.

I længere sløjfer vil forskellen i eksekveringstid mellem at bruge en forberedt sætning og afsendelse af almindelig SQL blive mærkbar.



  1. Baggrundsprocesser

  2. Hent kolonnedefinition for resultatsæt af lagret procedure

  3. Hvad bruges '$$' til i PL/pgSQL

  4. ALTER &DROP Tabel DDL med Execute Immediate i Oracle Database