Запись Checkbox в базу данных, php+mysql

Discussion in 'PHP' started by GAiN, 7 Oct 2011.

  1. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,544
    Likes Received:
    168
    Reputations:
    99
    сохранение флажка checkbox в mysql

    Подскажите!
    Необходимо записать значение флажка в таблицу БД MySQL (чтоб при открытии страницы все отмеченные флажки стояли на месте)
    есть ли статьи с примерами как реализовать это?
    ничего толкового я ненашёл, либо расписанно для умных программистов
     
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    939
    Likes Received:
    162
    Reputations:
    27
    Можешь установить любой форумный движок и посмотреть, какая там структура таблиц, которые отвечают за личные настройки. Там есть что то подобное. Имена полей, которые отвечают за флажки, имеют тип bool.
     
  3. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,508
    Likes Received:
    389
    Reputations:
    101
    Используйте тип столбца BIT, он же TINYINT(1). Если флажок в чекбоксе стоит, пишите 1, иначе нуль
     
  4. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,544
    Likes Received:
    168
    Reputations:
    99
    я видел примеры - где сессия хранится, а вот с базой проблемно, форум перелопачивать тоже не лёгкое дело, разобраться что да как
     
  5. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,544
    Likes Received:
    168
    Reputations:
    99
    запись Checkbox в базу данных, php+mysql

    Всем добрый день.
    сделал страничку с записью чекбоксов в БД.
    создал и заполнил таблицы:

    PHP:
    CREATE TABLE `tutorial_users` (

    `
    idINT10 NOT NULL AUTO_INCREMENT ,

    `
    usernameVARCHAR50 NOT NULL ,

    `
    adminTINYINTNOT NULL DEFAULT '0',

    PRIMARY KEY ( `id` )

    ENGINE MYISAM
    PHP:
    INSERT INTO `tutorial_users` (

    `
    id` ,

    `
    username` ,

    `
    admin`

    )

    VALUES (

    NULL 'Stewie''0'

    ), (

    NULL 'Peter''0'

    ), (

    NULL 'Brian''0'

    ), (

    NULL 'Meg''0'

    ), (

    NULL 'Lois''0'

    ), (

    NULL 'Chris''0'

    ), (

    NULL 'Greased Up Deaf Guy''0'

    ), (

    NULL 'Quagmire''0'

    );
    сама форма:
    PHP:
    <?php
    include("connect.php");
    $updated FALSE;
    if(
    count($_POST) > 0){
        
    $admin $_POST['admin'];
        
    array_map('intval',$admin);
        
    $admin implode(',',$admin);
        
    mysql_query("UPDATE tutorial_users SET admin=0") or trigger_error(mysql_error(),E_USER_ERROR);
        
    mysql_query("UPDATE tutorial_users SET admin=1 WHERE id IN ($admin)") or trigger_error(mysql_error(),E_USER_ERROR);
        
    $updated=TRUE;
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>phpfreaks checkbox tutorial</title>
    </head>
    <body>
    <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
    <?php
    if($updated===TRUE){
        echo 
    '<div>Privileges Updated!</div>';
    }
    ?>
    <table>
    <tr>
    <th>Username</th>
    <th>Admin Privileges</th>
    </tr>
    <?php
    $sql 
    "SELECT id,username,admin FROM tutorial_users ORDER by id ASC";
    $result mysql_query($sql) or trigger_error(mysql_error(),E_USER_ERROR);
    while(list(
    $id,$username,$admin)=mysql_fetch_row($result)){
        
    $checked = ($admin==1) ? 'checked="checked"' '';
        echo 
    '<tr><td>'.$username.'</td><td><input type="checkbox" name="admin[]" value="'.$id.'" '.$checked.'/></td></tr>'."\n";
    }
    ?>
    <tr><td colspan="2"><input type="submit" name="submit" value="Update Privileges" /></td></tr>
    </table>
    </form>
    </body>
    </html>
    файл connect.php:
    PHP:
    <?php   
      $dblocation 
    "localhost";   
      
    $dbname "user_base";   
      
    $dbuser "user";   
      
    $dbpasswd "password";   

      
    $dbcnx mysql_connect($dblocation$dbuser$dbpasswd);   
      if (!
    $dbcnx)   
      {   
        echo 
    "<p>К сожалению, не доступен сервер mySQL</p>";   
        exit();   
      }   
      if (!
    mysql_select_db($dbname,$dbcnx) )   
      {   
        echo 
    "<p>К сожалению, не доступна база данных</p>";   
        exit();   
      }   
      
    $ver mysql_query("SELECT VERSION()");   
      if(!
    $ver)   
      {   
        echo 
    "<p>Ошибка в запросе</p>";   
        exit();   
      }   
      echo 
    mysql_result($ver0);   
    ?>
    http://andreaandrea97.16mb.com/adds.php
    Здесь нужно сделать так, что включеный чексбокс с галочкой после нажатия на кнопку Update Privileges - должен стать disabled.
    (у меня почемуто когда прописывал атрибуды disabled стали сбрасыватся все другие сохранённые галочки, остаётся только одна сохранёная - которую сбрасывает другая)
    Так же нужно поставить на ограничение выбора - не все галки выбирать разом, а нажав на одну - с предыдущей снимается галка.
    и последне, наверное самое трудное: это нужно сделать при нажатии на чекбокс - справа от него появится поле ввода имени, куда прежде чем сохранить нужно его ввести, и после сохранения оно будет как и checkbox - только видным, (disabled)

    [​IMG]

    помогите пожалуйста, что и где надо изменить?, что то я совсем запутался, и не идёт как надо :(
     
  6. TikTik

    TikTik Member

    Joined:
    20 Feb 2009
    Messages:
    274
    Likes Received:
    13
    Reputations:
    2
    может тогда лучше использовать RADIO вместо CHECK
     
  7. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    эммм serialize($_POST['admin']); ?
     
  8. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,544
    Likes Received:
    168
    Reputations:
    99
    я пробовал вот так:
    http://andreaandrea97.16mb.com/names.php
    тут идёт сброс предыдущих чекбоксов при выборе нового:
    изменил вот это:

    строка: (параметр disabled добавил)
    $checked = ($admin==1) ? 'checked="checked" disabled' : '';
    было вот так до этого:
    $checked = ($admin==1) ? 'checked="checked"' : '';
     
  9. zinnyr

    zinnyr New Member

    Joined:
    12 Oct 2011
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    на самом деле,чем тебя Radio не устраивает?
     
  10. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,544
    Likes Received:
    168
    Reputations:
    99
    если честно, что то у меня с ним вообще ничего не вышло :(
     
  11. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,508
    Likes Received:
    389
    Reputations:
    101
    Вот пример с radio с минимальными изменениями кода
    PHP:
    if(count($_POST) > 0){
        
    $admin = (int) $_POST['admin'];
        
    mysql_query("UPDATE tutorial_users SET admin=0") or trigger_error(mysql_error(),E_USER_ERROR);
        
    mysql_query("UPDATE tutorial_users SET admin=1 WHERE id = '$admin'") or trigger_error(mysql_error(),E_USER_ERROR);
        
    $updated=TRUE;
    }
    // ...
    while(list($id,$username,$admin)=mysql_fetch_row($result)){
        
    $checked = ($admin=='checked="checked" disabled="disabled"' '');
        echo 
    '<tr><td>'.$username.'</td><td><input type="radio" name="admin" value="'.$id.'" '.$checked.'/></td></tr>'."\n";
    }
    Насчет появляющегося поля не понял, более подробно опишите, что нужно.
     
  12. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,544
    Likes Received:
    168
    Reputations:
    99
    получилось вот так:
    http://andreaandrea97.16mb.com/radio.php
    Здесь одна основная проблема, как и с чекбоксом, сбрасываются сохранённые данные, при сохранении нового, и не показывает множественный выбор, а только один созранённый результат
     
  13. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,544
    Likes Received:
    168
    Reputations:
    99
    надо с отмеченным чекбоксом или кнопкой, чтобы тот кто отметил - ввёл имя, чтобы это сохранилось в базу и при обновлении страницы вывелось, (отмеченный чекбокс + поле имя но редактировать их нельзя, они сохранены)
    но это совсем сложноватая затея, думаю хватит только отметки сохранения чекбоксов
     
  14. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,508
    Likes Received:
    389
    Reputations:
    101
    Уберите первый UPDATE-запрос из скрипта - это же так очевидно.
    чекбоксы + обработка событий средствами JavaScript/jQuery
     
  15. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,544
    Likes Received:
    168
    Reputations:
    99
    убранный запрос update не помог, скорее всего это проблема с disable, во первых он не сохраняется должным образом. а только один результат, во вторых сбрасывает старые галки. без него галки не сбрасываются
     
  16. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,544
    Likes Received:
    168
    Reputations:
    99
    вот как реализовал :
    http://andreaandrea97.16mb.com/adds33.php

    снять отмеченные галки:
    http://andreaandrea97.16mb.com/adds.php
    вот код :
    PHP:
    <?php
    include("connect.php");
    $updated FALSE;
    if(
    count($_POST) > 0){
        
    $admin $_POST['admin'];
        
    array_map('intval',$admin);
        
    $admin implode(',',$admin);
        
    mysql_query("UPDATE tutorial_users SET admin=1 WHERE id IN ($admin)") or trigger_error(mysql_error(),E_USER_ERROR);
        
    $updated=TRUE;
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>checkbox</title>
    </head>
    <body>
    <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
    <?php
    if($updated===TRUE){
        echo 
    '<div>настройки сохранены!</div>';
    }
    ?>
    <table>
    <tr>
    <th>список</th>
    <th>чекбоксы</th>
    </tr>
    <?php
    $sql 
    "SELECT id,username,admin FROM tutorial_users WHERE admin=0 ORDER by id ASC";
    $result mysql_query($sql) or trigger_error(mysql_error(),E_USER_ERROR);
    while(list(
    $id,$username,$admin)=mysql_fetch_row($result)){

        echo 
    '<tr><td>'.$username.'</td><td><input type="checkbox" name="admin[]" value="'.$id.'" /></td></tr>'."\n";
    }
    ?>
    <tr><td colspan="2"><input type="submit" name="submit" value="сохранить" /></td></tr>
    </table>
    </form>
    </body>
    </html>
    когда нажимаешь сохранить - не выбрав чекбокса то выдаёт ошибку:

    PHP:
    5.1.58
    Warning
    array_map() [function.array-map]: Argument #2 should be an array in /home/u908237098/public_html/adds33.php on line 6

    Warningimplode() [function.implode]: Invalid arguments passed in /home/u908237098/public_html/adds33.php on line 7

    Fatal error
    You have an error in your SQL syntaxcheck the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 in /home/u908237098/public_html/adds33.php on line 8
    подскажите что дописать нужно, чтобы не было ошибки?
     
  17. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    PHP:
    if(count($_POST) > 0){ 
    на


    PHP:
    if(isset($_POST['admin']) && is_array($_POST['admin'])){ 
    и кстате у тебя тут скуля ...

    PHP:
    array_map('intval',$admin); 
    на

    PHP:
    $admin array_map('intval',$admin); 
     
    #17 Doom123, 20 Oct 2011
    Last edited: 20 Oct 2011
    1 person likes this.
  18. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,544
    Likes Received:
    168
    Reputations:
    99
    Всё работает без ошибки, большое спасибо ! [​IMG]
    результат:
    PHP:
    <?php
    include("connect.php");
    $updated FALSE;
    if(isset(
    $_POST['admin']) && is_array($_POST['admin'])){
        
    $admin $_POST['admin'];
        
    $admin array_map('intval',$admin);
        
    $admin implode(',',$admin);
        
    mysql_query("UPDATE tutorial_users SET admin=1 WHERE id IN ($admin)") or trigger_error(mysql_error(),E_USER_ERROR);
        
    $updated=TRUE;
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>checkbox</title>
    </head>
    <body>
    <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
    <?php
    if($updated===TRUE){
        echo 
    '<div>настройки сохранены!</div>';
    }
    ?>
    <table>
    <tr>
    <th>список</th>
    <th>чекбоксы</th>
    </tr>
    <?php
    $sql 
    "SELECT id,username,admin FROM tutorial_users WHERE admin=0 ORDER by id ASC";
    $result mysql_query($sql) or trigger_error(mysql_error(),E_USER_ERROR);
    while(list(
    $id,$username,$admin)=mysql_fetch_row($result)){

        echo 
    '<tr><td>'.$username.'</td><td><input type="checkbox" name="admin[]" value="'.$id.'" /></td></tr>'."\n";
    }
    ?>
    <tr><td colspan="2"><input type="submit" name="submit" value="сохранить" /></td></tr>
    </table>
    </form>
    <script type="text/javascript">

            var handler = function ( event ){

              event = event || window.event;

              var target = event.target || event.srcElement;

              if ( target.nodeType == 1 && target.nodeName.toLowerCase() == "input" && target.type == "checkbox" && target.checked ) {

                var inputs = document.getElementsByTagName("input");

                for ( var i = 0; inputs[i]; i++ ) {

                  if ( inputs[i].type == "checkbox" && inputs[i] != target ) {

                    inputs[i].checked = false;

                  }

                }

              }

            }

            if (document.addEventListener){

              document.addEventListener('click', handler, false);

            } else if (document.attachEvent){

              document.attachEvent('onclick', handler);

            }

        </script>
    </body>
    </html>
     
    #18 GAiN, 20 Oct 2011
    Last edited: 20 Oct 2011
  19. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,544
    Likes Received:
    168
    Reputations:
    99
    в этой базе данных всё нормально отображается с кириллицей, а в другой вопросы вместо слов, как поправить ? всё стоит так же но не отображает в другой bd
    вот здесь


    [​IMG]
     
    #19 GAiN, 20 Oct 2011
    Last edited: 20 Oct 2011
  20. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    при подключении выполни эти запросы ..
    п.с еси у тебя не utf8 паоменяй
    Code:
    set character_set_client='utf8';
    set character_set_results='utf8';
    set collation_connection='utf8_general_ci';
    set NAMES 'utf8';
    
     
    1 person likes this.
Loading...