Я создаю класс под названием User
только с закрытыми переменными-членами и функциями получения / установки
class User {
private $m_id;
private $m_firstname;
private $m_lastname;
public function get_firstname() { return $this->m_firstnmae; }
public function set_firstname($firstname) { $this->m_firstname = $firstname; }
...
}
так print_r($user)
дал бы мне что-то вроде этого:
User Object
(
[m_id:User:private] => 2725
[m_firstname:User:private] => Alan
[m_lastname:User:private] => Turing
)
Теперь я использую PDO для вставки объекта в базу данных (я пропущу часть соединения, поскольку она работает, а не является частью проблемы). Вот моя функция для вставки данных:
function insert($user)
{
$insert_query = "insert into table (id,firstname,lastname) values (:id, :firstname, :lastname)";
try
{
$stmt = $this->m_pdo->prepare($insert_query);
$stmt->bindParam(':id', $user->get_id());
$stmt->bindParam(':firstname', $user->get_firstname());
$stmt->bindParam(':lastname', $user->get_lastname());
$stmt->execute();
return true;
}
catch (PDOException $ex)
{
echo $this->m_error_message = $ex->getMessage();
return false;
}
}
работает так же. ОДНАКО, когда я изменяю php error_reporting на E_ALL | E_STRICT
, которые также показывают строгое предупреждение во время выполнения, код вставки создает предупреждение strict standards only variables should be passed by reference
для bindParam
линий. Спросив Google, я обнаружил, что, очевидно, я должен сделать это в 2 шага:
$id = $user->get_id()
$stmt->bindParam(':id', $id);
После преобразования их в новый формат все работает без предупреждения.
Дело в том, мой оригинал User-class
намного больше с более чем 20 закрытыми переменными-членами, и у меня есть и другие классы, как это. Так что я думал перебрать переменные и сохранить их в массиве и bindParam
их как массив. Но тогда я сталкиваюсь с проблемой foreach
только перебирайте открытые переменные, но не закрытые … Итак, мои вопросы:
bindParam
с петлей как-нибудь?для удобства я везде использую один и тот же формат имен. т.е. столбец в базе данных с firstname
будет иметь коллегу m_firstname
в User-class
с get_firstname()
а также set_firstname($firstname)
как получатель / установщик
Я думаю, что вы должны использовать
public bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
Вместо bindParam () и держи добытчиков 🙂
перешел от комментария к ответу
Других решений пока нет …