Я хотел бы сохранить значение, которое иногда является строкой, иногда целым числом. (В PHP и MySQL)
Переменные настроены так:
$userID = 123; // Unique primary key, always a number
$name = "nameOfTheProperty"; // Always a string
$value = "someText" or 1234; // Depending on the property to save
Это работает, если его целочисленное свойство:
$sql = "INSERT INTO saves (`User_ID`, `$name`) VALUES ($userID, $value) ON DUPLICATE KEY UPDATE `$name`=$value";
И это если его строковое свойство:
$sql = "INSERT INTO saves (`User_ID`, `$name`) VALUES ($userID, '$value') ON DUPLICATE KEY UPDATE `$name`='$value'";
Как я могу заставить это работать вообще? Лучший в одном запросе.
MySQL не волнует, если вы передадите ‘строку’ в числовое поле:
INSERT INTO (intfield, charfield) VALUES ('42', '42')
вставил бы 42
в оба поля.
Однако то, что вы делаете, в основном уязвимо для атак с использованием SQL-инъекций. Вы должны использовать подготовленное заявление и заполнители. К сожалению, заполнители не могут представлять ничего, кроме VALUES, поэтому вам все равно нужно динамически создавать часть вашего запроса, например,
$safefield = $db->real_escape_string('nameOfField');
$sql = "INSERT INTO yourtable (`$safefield`) VALUES (?)";
$stmt = $db->prepare($sql);
$stmt->execute(array($value_for_field));
Столбец может иметь только один тип. Так определите столбец как varchar
и используйте кавычки каждый раз.
Лучшее решение — использовать подготовленные заявления.