Skip to content
Advertisement

How to ‘really’ detect integers from DB?

I’m trying to save some code with the following. I’ve an object with variables named the same as table rows so I could create an insert like this one:

$query = "INSERT INTO table ";
        $columns = '(';
        $values = 'VALUES (';
        foreach ($this as $var => $value){
            if ($value){
                $columns .= $var.', ';
                if (!is_int($value))
                    $value = '''.$value.''';
                $values .= $value.', ';
            }
        }
        $columns .= ')';
        $values .= ')';
        $columns = str_replace (', )', ')', $columns);
        $values = str_replace (', )', ')', $values);
        $query .= $columns." ".$values;

But every single variable is detected as string and that’s not true in all fields as you may imagine.

Does anyone have a solution?

Advertisement

Answer

Here’s how I would write it:

<?php
$canonical_columns = array_flip(array("column1", "column2", "column3"));
$columns = array_keys(array_intersect_key($canonical_columns, (array) $this));
$params = join(",", array_fill(0, count($columns), "?"));
$columns = join(",", $columns);
$query = "INSERT INTO table ($columns) VALUES ($params)";
$stmt = $pdo->prepare($query);
$stmt->execute(array_values($this));

Stop concatenating fragments of strings to form SQL.

Use PDO, and use parameters for values.

Allowlist column names by comparing inputs to known, valid column names.

User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement