Ниже приведен пример привязки неизвестного количества столбцов записи к значениям для вставки.
public function insert($table, array $data)
{
$sql = "INSERT INTO $table (" . join(',', array_keys($data)) . ') VALUES ('
. str_repeat('?,', count($data) - 1). '?)';
if($sth = $this->db->prepare($sql))
{
$sth->execute(array_values($data));
return $this->db->lastInsertId();
}
}
$id = $db->insert('user', array('name' => 'Bob', 'email' => 'foo@example.com'));
Не вдаваясь в подробности о том, как вышеприведенный код может быть структурирован лучше, вот решение, использующее C # 7. Обратите внимание, как назначается локальная функция для обработки события, а затем не назначена - с помощью делегирование типа ввода
void page1(){
txtStory.Text = "Can you sneak past the enemy?";
void Btn1Click(object s, EventArgs ev)
{
luckCheck();
if (lucky) {page2(); clearButtons(); btn1.Click -= Btn1Click; }
else {page3(); clearButtons();}
};
btn1.Click += Btn1Click;
void luckCheck(){
int luckTest = gen.Next(1,12);
if (luckTest <= playerLuck) {lucky = true;}
else {lucky = false;}
}
void clearButtons(){
btnN.Text = "";
btnS.Text = "";
btnE.Text = "";
btnW.Text = "";
btn1.Text = "";
btn2.Text = "";
btn3.Text = "";
btn4.Text = "";
btn5.Text = "";
btn6.Text = "";
}
void page2(){
txtStory.Text = "Lucky!";
}
void page3(){
txtStory.Text = "Not Lucky!";
}
Проблема, с которой вы сталкиваетесь, заключается в том, что page1()
прикрепляет метод анонимного обработчика, который никогда не отделяется, поэтому каждый раз, когда вы его вызываете, вы просто добавляете все больше обработчиков.
Но
Подумайте о другом дизайне, где у вас есть класс Page
для представления каждой страницы. Этот класс имел бы историю как свойство на ней и коллекцию возможных Choice
s (а не жесткое кодирование 6 из них). Choice
является классом со значением строки Description
и Action
, который должен быть выполнен, если он используется.
Ваше приложение может содержать свойство CurrentPage, и действие вашего Choice должно быть способный перемещаться, изменяя эту страницу. Etc и т. Д. ...
Надеюсь, что это поможет.
P.S. дополнительный наконечник. Вместо того, чтобы возвращать результат метода luckCheck
в поле класса, рассмотрите его перепроектирование, чтобы вернуть результат:
bool luckCheck(){
int luckTest = gen.Next(1,12);
return luckTest <= playerLuck;
}
else
файлаBtn1Click
или вне условия вообще. – Richardissimo 14 July 2018 в 04:39