Cascading Dropdown Ajax

Chào các bạn

Khi lập trình các bạn hay gặp vấn đề khó khăn khi lấy dữ liệu giữa các Dropdown List khác nhau. Ví dụ: Từ tỉnh thành -> quận huyện -> Xã phường…

Đây là khó khăn của rất nhiều bạn sinh viên khi mới bắt đầu học lập trình. Video dưới đây sẽ hướng dẫn bạn cách giải quyết, khá là đơn giản. Hoàn toàn có thể áp dụng nhiều trường hợp khác nhau.

Video không có tiếng, do mình làm trong lúc ngẫu hứng ngoài quán cafe. Các bạn có thể theo dõi, hoặc tải mã nguồn về phân tích thêm.

Slide giới thiệuhttps://docs.google.com/presentation/d/1soxUWN7Xa6Z89Az-PNCtiyGgMVdVSgmqzp1bf7hdi50/edit?usp=sharing

Tài nguyên

SQL Data:

CSDL tên Quốc gia, tỉnh thành phố thị xã quận huyện, xã phường Việt Nam

Demo

Cascading Dropdown Ajax

Code C#

 public class MyDbContext:DbContext
    {
        // Ở đây các bạn có thể khai báo trong Web.config.
        private const string sqlConnection = @"Data Source=.\SQLExpress; Initial Catalog = CountryDb; User Id=sa; Password = sa";

        public MyDbContext() : base(sqlConnection)
        {

        }
      
        public DbSet<Country> Countries { get; set; }
        public DbSet<Province> Provinces { get; set; }
        public DbSet<District> Districts { get; set; }
        public DbSet<Ward> Wards { get; set; }

    }

 

  public JsonResult GetAllCountries()
        {
            using(var db = new MyDbContext())
            {
                var data = db.Countries.OrderBy(x=>x.Name).ToList();
                return Json(data, JsonRequestBehavior.AllowGet);
            }
        }
        /// <summary>
        /// Hàm lấy danh sách tỉnh thành theo CountryId. 
        /// Id = 237 là của Việt Nam. Do database mình quy định vậy
        /// Test OK
        /// </summary>
        /// <param name="id">Id của country</param>
        /// <returns></returns>
        public JsonResult GetAllProvinceByCountryId(int? id=237) 
        {
            using (var db = new MyDbContext())
            {               
                var data = db.Provinces.Where(x=>x.CountryId== id).OrderBy(x=>x.Name).ToList();
                return Json(data, JsonRequestBehavior.AllowGet);
            }
        }
        /// <summary>
        /// Hàm lấy tất cả danh sách quận huyện
        /// Id = 1 là Hà Nội, do database mình quy định vậy
        /// Test OK
        /// </summary>
        /// <param name="id">Id = ProvinceId</param>
        /// <returns></returns>
        public JsonResult GetAllDistrictByProvinceId(int? id = 1)
        {
            using (var db = new MyDbContext())
            {
                var data = db.Districts.Where(x => x.ProvinceId == id).OrderBy(x=>x.Name).ToList();
                return Json(data, JsonRequestBehavior.AllowGet);
            }
        }
        /// <summary>
        /// Hàm lấy danh sách xã phường theo quận huyện
        /// Id= 1 là Ba Đình. Do database quy định
        /// Test OK
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public JsonResult GetAllWardByDistrictId(int? id = 1)
        {
            using (var db = new MyDbContext())
            {
                var data = db.Wards.Where(x => x.DistrictId == id).OrderBy(x=>x.Name).ToList();
                return Json(data, JsonRequestBehavior.AllowGet);
            }
        }

Code js

// File javascript để lấy dữ liệu

// Khai báo URL service của bạn ở đây
var baseService = "/Service";
var countryUrl = baseService + "/GetAllCountries";
var provinceUrl = baseService + "/GetAllProvinceByCountryId";
var districtUrl = baseService + "/GetAllDistrictByProvinceId";
var wardUrl = baseService + "/GetAllWardByDistrictId";
$(document).ready(function () {
    // load danh sách country
    _getCountries();
    $("#ddlCountry").on('change', function () {
        var id = $(this).val();
        if (id != undefined && id != '') {
            _getProvince(id);
        }
    });

    $("#ddlProvince").on('change', function () {
        var id = $(this).val();
        if (id != undefined && id != '') {
            _getDistrict(id);
        }
    });
    $("#ddlDistrict").on('change', function () {
        var id = $(this).val();
        if (id != undefined && id != '') {
            _getWard(id);
        }
    });
    $("#ddlWard").on('change', function () {
        var countryText = $("#ddlCountry option:selected").text();
        var provinceText = $("#ddlProvince option:selected").text();
        var districtText = $("#ddlDistrict option:selected").text();
        var wardText = $("#ddlWard option:selected").text();
        var html = "Quốc gia: " + countryText + " Tỉnh thành: " + provinceText + " " + "Quận huyện: " + districtText + " " + "Xã phường: " + wardText;
        html += "</br>Quê bạn thật là đẹp. Chúc mừng bạn!!!";
        $("#divResult").html(html);
    });
});
function _getCountries() {
    $.get(countryUrl, function (data) {
        if (data != null && data != undefined && data.length) {
            var html = '';
            html += '<option value="">--Không chọn--</option>';
            $.each(data, function (key, item) {
                html += '<option value=' + item.Id + '>' + item.Name + '</option>';
            });
            $("#ddlCountry").html(html);
        }
    });
}
// truyền id của country vào
function _getProvince(id) {
    $.get(provinceUrl + "/"+id, function (data) {
        if (data != null && data != undefined && data.length) {
            var html = '';
            html += '<option value="">--Không chọn--</option>';
            $.each(data, function (key, item) {
                html += '<option value=' + item.Id + '>' + item.Name + '</option>';
            });
            $("#ddlProvince").html(html);
        }
    });
}
// truyền id của province vào
function _getDistrict(id) {
    $.get(districtUrl + "/" + id, function (data) {
        if (data != null && data != undefined && data.length) {
            var html = '';
            html += '<option value="">--Không chọn--</option>';
            $.each(data, function (key, item) {
                html += '<option value=' + item.Id + '>' + item.Name + '</option>';
            });
            $("#ddlDistrict").html(html);
        }
    });
}
// truyền id của district vào
function _getWard(id) {
    $.get(wardUrl + "/" + id, function (data) {
        if (data != null && data != undefined && data.length) {
            var html = '';
            html += '<option value="">--Không chọn--</option>';
            $.each(data, function (key, item) {
                html += '<option value=' + item.Id + '>' + item.Name + '</option>';
            });
            $("#ddlWard").html(html);
        }
    });
}

Chúc các bạn thành công.

Download  GitHub

How to Upload file in Angular

Backend:

Link demo: http://angular.tuanitpro.com/#/uploader

  • Username: tuanitpro
  • Password: 123456

 

uploader.component.css

input[type='file']{
    display: none;
}
#uploader{
    width:100%; color:#fff; 
    font-family:Verdana, Geneva, Tahoma, sans-serif; 
     background:#0094ff;
      text-align:center;
       padding:50px;
        cursor:pointer;
}

uploader.component.html

<div class="container body">
  <div class="main_container">

    <div class="right_col" role="main">


      <div class="">
        <div class="clearfix"></div>
        <div class="row">
          <div class="col-md-12">
            <h2>Angular 4 - Upload file</h2>
          </div>

          <div class="col-md-12 col-sm-12 col-xs-12">
            <div class="x_panel" style="height: auto;">

              <div class="x_content">

                <input type="file" id="fileUploadInput" accept="images/*" (change)="fileChange($event)" />
                <div id="uploader"                    (click)="doUploadFile()">
                 <i class="fa fa-picture-o"></i> {{uploadResult.uploadingText}}
                </div>
                <div class="progress progress-striped" *ngIf="uploadResult.progress > 0">
                  <div class="progress-bar progress-bar-success"  [ngStyle]="{'width':  uploadResult.progress+'%'}">{{uploadResult.progress}}%</div>
                </div>
                <img  *ngIf="uploadResult.fileUrl" src="{{uploadResult.fileUrl}}" style="width:100%;" class="img-response">
              </div>
            </div>
          </div>
        </div>
      </div>





    </div>

  </div>
</div>

uploader.component.ts

import { Component, OnInit } from '@angular/core';
import { Title } from '@angular/platform-browser';
import { Http } from '@angular/http';

import $ from 'jquery/dist/jquery.min';

@Component({
  selector: 'app-uploader',
  templateUrl: './uploader.component.html',
  styleUrls: ['./uploader.component.css']
})
export class UploaderComponent implements OnInit {
  uploadingText = 'Chọn file (chỉ chấp nhận file ảnh)';
  uploadResult: any = {
    progress: 0,
    uploadingText: this.uploadingText,
    fileUrl: null
  }
  constructor(private title: Title) { }
  ngOnInit() {
    this.title.setTitle("Angular 4 - Upload file"); 
  }
  doUploadFile() {
    this.uploadResult.progress = 0;
    this.uploadResult.fileUrl = null;
    this.uploadResult.uploadingText = this.uploadingText;
    $("#fileUploadInput").trigger("click");
  }
  fileChange(event) {
    let fileList: FileList = event.target.files;
    if (fileList.length > 0) {
      let file: File = fileList[0];
      let formData: FormData = new FormData();
      formData.append('uploadFile', file);
      let xhr: XMLHttpRequest = new XMLHttpRequest();
      xhr.withCredentials = false;
      xhr.onreadystatechange = () => {
        if (xhr.readyState === 4) {
          if (xhr.status === 200) {
            let json = JSON.parse(xhr.response);
            let fileUrl = 'http://minhquandalat.com/uploads/' + json.Name;
            this.uploadResult.progress = 100;
            this.uploadResult.fileUrl = fileUrl;
            this.uploadResult.uploadingText = "Hoàn thành";

          } else {
            console.log(xhr.response);
          }
        }
      };
      xhr.upload.onprogress = (event) => {
        this.uploadResult.uploadingText = "Đang tải ảnh lên...";
        let percentVal = Math.round(event.loaded / event.total * 100);
        this.uploadResult.progress = percentVal;
      };
      xhr.open('POST', "http://minhquandalat.com/api/FileUpload", true);
      xhr.send(formData);
    }
  }
}

Happy coding

Convert Image to Base64 String and Base64 String to Image

This article will help you to learn how we can convert an image into a base64 string and base64 string back to image.

Image to Base64 String

public string ImageToBase64(Image image, System.Drawing.Imaging.ImageFormat format)
{
  using (MemoryStream ms = new MemoryStream())
  {
    // Convert Image to byte[]
    image.Save(ms, format);
    byte[] imageBytes = ms.ToArray();

    // Convert byte[] to Base64 String
    string base64String = Convert.ToBase64String(imageBytes);
    return base64String;
  }
}

Base64 String to Image

public Image Base64ToImage(string base64String)
{
  // Convert Base64 String to byte[]
  byte[] imageBytes = Convert.FromBase64String(base64String);
  MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);

  // Convert byte[] to Image
  ms.Write(imageBytes, 0, imageBytes.Length);
  Image image = Image.FromStream(ms, true);
  return image;
}

Coding in real world

 


Result

Download: https://github.com/tuanitpro/base64toimage

Online test: http://codebeautify.org/base64-to-image-converter

Happy coding ?

How to create own dynamic type or dynamic object in C#

How to create own dynamic type or dynamic object in C#
How to create own dynamic type or dynamic object in C#

using System.Reflection;
using System.Reflection.Emit;
public static class MyTypeBuilder
{

public static System.Collections.IList CreateInstanceIList(Type _type)
{
Type customList = typeof(List<>).MakeGenericType(_type);
var result = (System.Collections.IList)Activator.CreateInstance(customList);
return result;
}
public static Type CompileResultType(Dictionary listOfFields)
{
TypeBuilder tb = GetTypeBuilder();
foreach (var field in listOfFields)
CreateProperty(tb, field.Key, field.Value);

Type objectType = tb.CreateType();

return objectType;
}

private static TypeBuilder GetTypeBuilder()
{
var typeSignature = “MyDynamicType_” + DateTime.Now.ToString(“yyyyMMddHHmmss”);
var an = new AssemblyName(typeSignature);
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(“MainModule”);
TypeBuilder tb = moduleBuilder.DefineType(typeSignature,
TypeAttributes.Public |
TypeAttributes.Class |
TypeAttributes.AutoClass |
TypeAttributes.AnsiClass |
TypeAttributes.BeforeFieldInit |
TypeAttributes.AutoLayout,
null);
return tb;
}

private static void CreateProperty(TypeBuilder tb, string propertyName, Type propertyType)
{
FieldBuilder fieldBuilder = tb.DefineField(“_” + propertyName, propertyType, FieldAttributes.Private);

PropertyBuilder propertyBuilder = tb.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
MethodBuilder getPropMthdBldr = tb.DefineMethod(“get_” + propertyName, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, propertyType, Type.EmptyTypes);
ILGenerator getIl = getPropMthdBldr.GetILGenerator();

getIl.Emit(OpCodes.Ldarg_0);
getIl.Emit(OpCodes.Ldfld, fieldBuilder);
getIl.Emit(OpCodes.Ret);

MethodBuilder setPropMthdBldr =
tb.DefineMethod(“set_” + propertyName,
MethodAttributes.Public |
MethodAttributes.SpecialName |
MethodAttributes.HideBySig,
null, new[] { propertyType });

ILGenerator setIl = setPropMthdBldr.GetILGenerator();
Label modifyProperty = setIl.DefineLabel();
Label exitSet = setIl.DefineLabel();

setIl.MarkLabel(modifyProperty);
setIl.Emit(OpCodes.Ldarg_0);
setIl.Emit(OpCodes.Ldarg_1);
setIl.Emit(OpCodes.Stfld, fieldBuilder);

setIl.Emit(OpCodes.Nop);
setIl.MarkLabel(exitSet);
setIl.Emit(OpCodes.Ret);

propertyBuilder.SetGetMethod(getPropMthdBldr);
propertyBuilder.SetSetMethod(setPropMthdBldr);
}
}
How to use

public JsonResult DynamicObject()
{

Dictionary listOfFields = new Dictionary();

listOfFields.Add(“Name”, typeof(string));
listOfFields.Add(“Age”, typeof(int));
var myType = MyTypeBuilder.CompileResultType(listOfFields);
var myObject = Activator.CreateInstance(myType);

myType.GetProperty(“Name”).SetValue(myObject, “Tuan”, null);
myType.GetProperty(“Age”).SetValue(myObject, 20, null);

object name = myType.GetProperty(“Name”).GetValue(myObject);

return Json(name.ToString(), JsonRequestBehavior.AllowGet);
// return Json(myObject, JsonRequestBehavior.AllowGet);
}
Mapping data to List

public JsonResult DynamicObject2()
{
Dictionary listOfFields = new Dictionary();
listOfFields.Add(“Name”, typeof(string));
listOfFields.Add(“Age”, typeof(int));

var myType = MyTypeBuilder.CompileResultType(listOfFields);
var list = MyTypeBuilder.CreateInstanceIList(myType);
var listString = listOfFields.Select(x => x.Key).ToArray();

Type t = typeof(YourObject); // your class define
PropertyInfo[] props = t.GetProperties().Where(x => listString.Contains(x.Name)).ToArray();

var data = ListYourObjects(); // your list data

// mapping only you need
foreach (var item in data)
{
var myObject = Activator.CreateInstance(myType);
foreach (var prop in props)
{
object name = t.GetProperty(prop.Name).GetValue(item);
myType.GetProperty(prop.Name).SetValue(myObject, name, null);

}
list.Add(myObject);
}

return Json(list, JsonRequestBehavior.AllowGet);
}

Cách học lập trình ASP.NET MVC tốt nhất?

Bài viết được dịch từ trang web Danylkoweb

Gần đây tôi có tham dự một cuộc hội thảo CONDG hàng tháng và đã gặp một vài người có hứng thú trong việc học cách sử dụng ASP.NET MVC.

Thật trùng hợp, tôi cũng thấy có khá nhiều người trên mạng xã hội Quora hỏi về cách thức tốt nhất để học ASP.NET MVC. Ngoài việc thảo luận về cách tốt nhất để tìm hiểu nó, tôi cũng sẽ đưa ra những cách nhanh nhất để học lập trình ASP.NET MVC.

Học những kiến thức nền tảng trước

Nếu bạn là người chỉ mới bắt đầu làm quen với ASP.NET, thì bạn cần phải học VB.NET hoặc C# trước. Cả hai ngôn ngữ lập trình này là một phần của ASP.NET, do đó bạn cần phải quen thuộc với một (hoặc cả hai) ngôn ngữ.

Khi mới bắt đầu, tôi muốn giới thiệu tới bạn một cuốn sách C# của nhà xuất bản Apress có tên là Beginning C# Object-Oriented Programming của tác giả Dan Clark. Đây là một trong những cuốn sách có nội dung khá dễ hiểu dành cho người mới bắt đầu.

Nếu bạn là một người đã có kinh nghiệm lập trình trong (Java, C, C++, v.v…), thì tôi muốn giới thiệu tới bạn một cuốn sách khác từ Apress tên là Pro C# 5.0 and the .NET 4.5 Framework của tác giả Andrew Troelsen.

Bây giờ bạn biết mọi thứ về C#, lúc này bạn sẽ chuyển sang ASP.NET MVC.

Nếu bạn đang quan tâm đến cách làm thế nào để bắt đầu học Lập trình website với ASP.NET MVC thì tôi đang có Khóa học Lập trình ASP.NET MVC dành cho bạn đấy. Hình thức học linh hoạt, giúp bạn cách tiếp cận hoàn toàn khác biệt sách vở.

Bắt đầu tìm hiểu về ASP.NET MVC

Bạn có biết ASP.NET MVC là một nền tảng mã nguồn mở của Microsoft giúp cho công việc phát triển web của bạn trở nên dễ dàng hơn so với công nghệ trước đó của họ được gọi là WebForms. MVC là cụm từ viết tắt của Model-View-Controller. Đây là một pattern về kiến trúc phần mềm đã được hình thành từ những năm 1970 và 80.

Cách nhanh nhất để tìm hiểu một công nghệ mới là tìm hiểu sâu về cách mọi thứ hoạt động. Một cách để làm điều này đó là bạn hãy tải về và xem xét vòng đời của một ứng dụng web MVC. Đây là một tài liệu rất dễ hiểu và bổ ích. Tất cả mọi thứ được giải thích cho bạn qua những chi tiết cụ thể. Thậm chí tôi đã in nó ra và dán lên tường nơi bàn làm việc của mình.

Nếu bạn đang tìm kiếm một tài liệu để đọc, thì tôi muốn giới thiệu tới bạn cuốn sách có tên là Pro ASP.NET MVC 5 của tác giả Adam Freeman. Tôi đã thu được rất nhiều kiến thức cơ bản về lập trình ASP.NET MVC trong cuốn sách này và vẫn tham khảo lại khi cần.

Những khóa học lập trình trực tuyến

Nếu bạn đang tìm kiếm một khóa học lập trình trực tuyến chất lượng, thì một trong những trang web tôi yêu thích và thường hay lui tới là Pluralsight. Pluralsight có hơn 1.000 khóa học về tất cả mọi thứ từ lập trình web tới di động và ảo hóa. Bạn phải trả $30/tháng và tham gia các khóa học không giới hạn.

Về các khóa học ASP.NET MVC, tôi muốn giới thiệu tới bạn các khóa học Pluralsight sau đây:

  • ASP.NET MVC 5 Fundamentals – Scott Allen
  • Automated ASP.NET MVC Testing: End to End – Jason Roberts
  • Architecting Applications for the Real World in .NET – Cory House

Hầu hết các khóa học này có thời lượng từ 2 đến 3 giờ, bởi vậy bạn hãy dành đủ thời gian để hoàn thành các khóa học chất lượng này nhé!

Tạo ra một sản phẩm thú vị

Cuối cùng, hãy bắt đầu áp dụng kiến thức bạn đã học được bằng cách xây dựng một sản phẩm gì đó. Bạn đã học đến lúc này, tại sao lại không bắt đầu xây dựng một ứng dụng web? Dưới đây là một vài ý tưởng để giúp bạn bắt đầu:

  • Tạo ra một ứng dụng dạng To-do list (danh sách công việc phải làm)
  • Xây dựng một danh sách liên lạc (contact list)
  • Viết một blog nhỏ

Kết luận

Ưu điểm của phương pháp học này là bạn có thể áp dụng kiến thức đã học vào thực tế một cách nhanh chóng. Và bạn cũng có thể áp dụng cách học này cho những ngôn ngữ lập trình khác.

Viết code trong các ngôn ngữ lập trình khác sẽ trở nên ngày càng dễ dàng hơn cùng với kinh nghiệm mà bạn đã tạo ra cho chính mình.

Bạn có cách nào nhanh hơn để tìm hiểu về ASP.NET MVC? Hãy để lại ý kiến của mình trong phần bình luận phía dưới nhé!

Về tác giả bài viết:

hoc-lap-trinh-truc-tuyen-online-aspnet-mvc-tot-nhat-14012016-2Tác giả bài viết là Jonathan Danylko. Anh là người có trên 30 năm kinh nghiệm lập trình và hiện nay Jonathan đang tập trung vào lĩnh vực ASP.NET MVC Best Practices, Code Exorcisms (refactorings)…

 

Nguồn bài dịch: Techmaster.vn

Tại sao bạn nên chọn PHP để lập trình web?

Bài viết được dịch từ trang web SitePoint

Đó là một câu hỏi phổ biến. Tại sao thực sự nên chọn PHP chứ không phải là một lựa chọn nào khác? Sau tất cả, PHP thường bị xem như là một ngôn ngữ lộn xộnkhông sử dụng được và có thiết kế rất tồi. Tại sao mọi người chọn nó khi bắt đầu một dự án từ đầu?

Thay vì liệt kê những lý do tại sao mọi người chọn nó (cái này có rất nhiều), chúng ta hãy tập trung vào lý do tại sao mọi người nên chọn nó. Tuy nhiên, chúng ta không thể nói về điều đó mà không đề cập đến những trường hợp mà nó không nên được sử dụng.

Khi nào thì bạn KHÔNG nên chọn PHP

Khi viết các ứng dụng dạng command line

Nếu bạn xây dựng một ứng dụng dạng dòng lệnh (command line), PHP không phải là sự lựa chọn đúng. Chắc chắn là cũng có những cách tiếp cận tốt để xây dựng ứng dụng CLI (Command Line Interface) bằng PHP, nhưng chỉ đơn giản là nó không được thiết kế với mục đích làm điều đó. Đầu tiên và trước hết, PHP là một ngôn ngữ web, và một ứng dụng thuần command line tốt hơn là nên được xây dựng bằng một ngôn ngữ khác. Điều đó không phải để nói rằng nó không thể – mà chắc chắn ứng dụng đó sẽ nhanh hơn và dễ dàng hơn khi thực hiện bằng một ngôn ngữ khác. Việc xây dựng các ứng dụng CLI bằng PHP thì tự bản thân nó chính là phép ẩn dụ mà người ta sử dụng khi so sánh PHP với một cái búa có hai đầu dùng để nhổ đinh. Chỉ vì nó không phải là công cụ dành cho việc đó. Ví dụ – Python được cài đặt sẵn trên hầu hết các hệ điều hành họ *nix, vì vậy bạn có thể truy cập ngay lập tức tới nó mà không cần phải vọc vậy chỉnh sửa file php.ini, và có thể bắt đầu làm việc ngay lập tức.

Khi nó có vẻ như dễ dàng nhất

Nếu PHP có vẻ là cách dễ dàng nhất trong các ngôn ngữ và đó là động lực duy nhất của bạn, thì sự lựa chọn đó của bạn là sai lầm. PHP có thể trở nên phức tạp một cách nhanh chóng, và phải thừa nhận rằng việc dễ dàng hơn những ngôn ngữ khác là điều không thực tế. Việc thực hiện những dự án quan trọng thì độ khó cũng tương đương nhau trong bất kỳ ngôn ngữ nào.

Chỉ vì nhà cung cấp hosting của bạn hỗ trợ nó

Nếu bạn đang sử dụng một shared host, và vui sướng với thực tế rằng nó hỗ trợ PHP (thậm chí không phải là phiên bản mới nhất), hãy dừng lại. Nếu bạn đang xem mình là một nhà phát triển phần mềm, thì đừng bao giờ sử dụng các shared host cho bất cứ điều gì ngoại trừ một số thứ lặt vặt như custom webmail, quản lý domain, hoặc những demo hết sức đơn giản. Với những lựa chọn thay thế như DigitalOcean cung cấp các máy chủ riêng ảo (VPS – Virtual Private Server) được lưu trữ trên ổ SSD với chi phí ít nhất là $5 đô-la/tháng, thì việc chọn một shared host không có ý nghĩa gì – vì VPS mang lại cho bạn nhiều quyền kiểm soát hơn. Nếu bạn không hài lòng với đội ngũ DevOps của họ và không thích tự tay thiết lập server (dù vậy bạn thực sự nên tìm hiểu cách làm điều đó), có rất nhiều nhà cung cấp cloud hosting đưa ra các tầng miễn phí được cấu hình sẵn cho bạn. Hãy tránh xa các shared host.

Phần mềm tính toán mạnh

Khi bạn muốn viết phần mềm làm việc rất nhiều với toán học, các tính toán phức tạp, thống kê và những thứ tương tự như vậy, có những lựa chọn tốt hơn – đặc biệt là nếu ứng dụng đó chủ yếu làm công việc này là chính. Thì các ngôn ngữ dạng functional như Scala hoặc ngôn ngữ mới Dart sẽ thực thi tác vụ này tốt hơn nhiều so với PHP, vì nếu làm bằng PHP có thể yêu cầu nhiều nỗ lực hơn để nó có khả năng làm những việc bạn muốn. PHP cũng chậm hơn đáng kể ở những công việc mà các ngôn ngữ khác được thiết kế dành riêng cho chúng.

Đôi khi sẽ đơn giản hơn nếu viết phần nặng về tính toán của các ứng dụng trong ngôn ngữ mà bạn đang làm việc hiện tại, nhưng đó thường là một sự lười biếng. Sự khó chịu khi phải cài đặt một ngôn ngữ helper hoặc máy ảo và xây dựng phần đó như một ứng dụng riêng biệt thường được bù đắp bởi những lợi ích lâu dài, đặc biệt khi lượng traffic bắt đầu đòi hỏi điều đó. Có một lý do mà phần tính toán back-end của mạng xã hội Twitter được viết bằng Scala, mặc dù phần front-end của họ vẫn là Ruby on Rails.

PHP là rất dễ học

Các vấn đề được liệt kê ở trên là những vấn đề của việc thiếu kiến thức và kinh nghiệm, và đương nhiên là khi ai đó sử dụng PHP cho một mục đích như vậy thì kết quả cuối cùng là không được tối ưu – nó sẽ bổ sung thêm những ý kiến xấu đến danh tiếng đã bị hoen ố của PHP. Vậy PHP tốt nhất cho điều gì?, đó là bất kỳ kịch bản hướng web nào cần phát triển nhanh chóng, và cần thực hiện thực sự nhanh.

PHP có một cộng đồng rất lớn. Đúng vậy, đại đa số là các tay lính mới, nhưng một khi bạn đã gạt bỏ những thành phần linh tinh, còn lại là một số ít các chuyên gia có tâm huyết như Phil SturgeonJosh LockhartMike van Riel,Anthony Ferrara và rất nhiều người khác nữa. Một tá chuyên gia có nhiều tâm huyết thừa nhận những nhược điểm của PHP, nhưng cũng làm việc vất vả trong việc hướng dẫn cho cộng đồng và sửa chữa những vấn đề đó, họ có thể cung cấp một kho tàng kiến thức có giá trị. Cùng với những nguồn tài nguyên tuyệt vời như diễn đàn SitePoint,StackOverflow và PTRW, những vấn đề gặp phải trong PHP dễ dàng được giải quyết, và quá trình này thường nhanh chóng và có chất lượng cao. Trừ khi các câu hỏi mà bạn đặt ra là hết sức ngớ ngẩn (và vâng,  những câu hỏi ngớ ngẩn), cộng đồng này luôn luôn sẵn sàng giúp đỡ.

Số lượng các dự án mã nguồn mở cũng như là các cuốn sách và khóa học về PHP là rất dồi dào, với sự kiên nhẫn và tài liệu hướng dẫn thì bạn có thể trở nên rất thông thạo ngôn ngữ này trong một khoảng thời gian tương đối ngắn.

Xua tan những tin xấu

PHP đã trưởng thành hơn nhiều kể từ lần cuối cùng mà người ta tập hợp những điểm tồi của nó, và nó đã kế thừa rất nhiều những tính năng hiện đại của các ngôn ngữ khác. Thành kiến ở đây rất phổ biến, và chúng ta nên học cách để nhận ra điều đó. Như nội dung bài viết tuyệt vời này trên blog MailChimp từ năm 2010 nói rằng, nó không phải là công cụ, mà do cách bạn sử dụng nó như thế nào.

PHP cho phép nhanh chóng tạo nguyên mẫu của tất cả các loại ứng dụng, và có thể giúp bạn dựng lên chạy thử mà không tốn nhiều thời gian. Nó là một ngôn ngữ nhanh và mạnh mẽ, và thậm chí còn nhanh hơn cả Ruby on Rails và Python trong rất nhiều các ứng dụng web phức tạp, cùng với những lợi ích tăng thêm của các dự án nhưHHVM và Phalcon, hiệu suất của PHP là không có đối thủ trong các ngôn ngữ dynamic.

Bây giờ, trước khi bạn hùa theo đám đông và hét toáng lên là “chỉ cần sử dụng NodeJS, nó là tốt nhất!” hay “MailChimp sẽ tốt hơn bằng cách sử dụng NodeJS ngay từ đầu”, thì trước tiên bạn hãy xem xét sự hỗn loạn và phân mảnh của thế giới JavaScript hiện nay. Có tuổi đời trẻ hơn PHP, nhưng các framework của JS nhiều hơn – đó là một điểm mà nhiều kẻ ghét PHP thường đem ra chế diễu. Ngoài ra luôn có sự chênh lệch giữa các giải pháp khác nhau, và mỗi cái đều tuyên bố mình là “đơn giản hơn/ tốt hơn/ nhanh hơn để làm việc X”. Cộng đồng này là rất lớn, nhưng bị phân mảnh khủng khiếp. Điều này được thể hiện qua một tweet vui trên mạng xã hội Twitter như sau:

Trò chơi uống rượu phạt cho các nhà phát triển web:
(1) Bạn hãy nghĩ ra một danh từ
(2) Hãy tìm kiếm trên Google cụm từ “<tên danh từ đó>.js”
(3) Nếu có một thư viện với tên đó đã tồn tại – thì phạt uống một ly rượu
— Shay Friedman (@ironshay)

Ý định của tôi không phải là đi bôi nhọ những ngôn ngữ khác – những người khác có thể làm công việc đó tốt hơn rất nhiều trong việc phân tích nhược điểm của JS hơn tôi – điều mà tôi đang cố gắng chỉ ra đó là thực tế rằng ai cũng có thể soi mói vào những nhược điểm của bất kỳ ngôn ngữ nào. Cũng giống như trong cuộc sống vậy, nếu bạn chỉ tập trung vào những thứ tiêu cực thì bạn sẽ chẳng bao giờ có những trải nghiệm tốt cả – những nhược điểm của PHP đã được chăm sóc bởi các thư viện và framework, và trong khi người ta có thể lập luận rằng một “ngôn ngữ đích thực” thì không cần các bản vá lỗi hoặc sự giúp đỡ của các công ty lớn để làm việc, nhưng ai có thể đếm được chính xác những gì các thư viện và các gói Java, NPM hoặc PUB dùng để vá lỗi và cải tiến ngôn ngữ này, bổ sung thêm những chức năng còn thiếu để người ta có thể sử dụng.

Vì vậy hãy dừng ngay việc tập trung vào bàn về ngôn ngữ X dở như thế nào, mà hãy bắt đầu làm việc trên các dự án chứng tỏ tính ưu việt trong sự lựa chọn của chúng ta. Vâng, có những dự án ngoài kia làm giảm uy tín của nó – WordPress là một trong những dự án như vậy – nhưng nếu chúng ta kiên trì và xây dựng với những thứ tốt nhất, chúng ta có thể xua tan đi những tiếng xấu và bắt đầu xây dựng lại thế giới PHP mà chúng ta yêu quý.

Kết luận

PHP là một lựa chọn tuyệt vời cho các dự án mới bất kể sự phức tạp của chúng. Thế giới PHP đã phát triển với những bước đi thần tốc trong một vài năm gần đây, và một số tính năng mới mang tính cách mạng có thể đưa vào sử dụng ngay hôm nay (tham khảo các liên kết về HHVM và Phalcon ở trên). Theo tôi thì nó nên là công cụ chính trong hộp công cụ của bạn – việc thông thạo nhiều ngôn ngữ lập trình cũng mang lại hữu ích như bạn biết nhiều ngoại ngữ vậy – nhưng chắc chắn sẽ tốt hơn nếu bạn thật tinh thông về một ngôn ngữ. PHP cung cấp cho bạn khả năng đi từ ý tưởng, đến nguyên mẫu, tới sản phẩm trong thời gian rất ngắn – và đó không phải là điều mà nhiều ngôn ngữ làm được. Những tiến bộ gần đây như OpCache built-in và các máy ảo như HHVM đưa ngôn ngữ này đi xa hơn, cho phép bạn giảm đáng kể chi phí cloud hosting, và các trình giám sát hiệu năng như AppDynamics sẽ cho phép bạn sử dụng đến tận cùng giới hạn của nó.

Khi xem xét dự án tiếp theo của bạn – đừng hỏi bản thân “Ai ghét PHP?” hoặc “Mọi người sẽ nghĩ gì?”. Những câu hỏi này tạo ra sự vô nghĩa và bất an. Bạn nghĩ về bất cứ cái gì, chẳng hạn như MailChimp, hệ thống cung cấp sức mạnh để gửi hàng triệu email mỗi ngày, đã được xây dựng bằng PHP trước khi họ “sửa lại”? Thay vì đó, hãy tập trung làm tốt nhất công việc của mình và tạo ra sản phẩm có ích cho xã hội.

Nguồn: http://techmaster.vn/

PHP Upload file

Upload file là một vấn đề quan trọng và cần thiết khi lập trình web. Chúng ta cần tải hình ảnh lên hosting, tải file ….
Đoạn code nhỏ trong php sau đây cho phép bạn làm thực hiện điều đó thật đơn giản.

PHP Upload file
PHP Upload file

Cấu hình file “php.ini”

Đầu tiên, để chắc chắn PHP cho phép upload file, chúng ta cần kiểm tra trong file php.ini. Trong file php.ini tìm đến dòng file_uploads gán = On

file_uploads = On

Thiết kế trang html

<!DOCTYPE html>
<html>
<body>
<h1>PHP - Upload file demo <a href="http://tuanitpro.com">http://tuanitpro.com</a></h1>
<form action="upload2.php" method="post" enctype="multipart/form-data">
    Chọn file upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Tải lên" name="submit">
</form>
<hr/>

</body>
</html>

Có vài quy tắc bạn cần nhớ.

  • Form phải để phương thức POST
  • Bắt buộc phải có thuộc tính
    enctype="multipart/form-data"
  • action của form chỉ đến trang upload2.php, là trang chứa code PHP thực hiện phía server.

Code trang upload2.php

<?php

if(isset($_POST["submit"])) {
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
	// Kiểm tra file upload lên có phải là ảnh không?

    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File có định dạng - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "Chỉ cho phép hình ảnh.";
        $uploadOk = 0;
    }
 
// Kiểm tra file tồn tại hay chưa?
if (file_exists($target_file)) {
    echo "File đã tồn tại.";
    $uploadOk = 0;
}
// Kiểm tra kích thước file 500000 byte
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "File quá lớn.";
    $uploadOk = 0;
}
// Kiểm tra định dạng ảnh hợp lệ không?
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "Chỉ cho phép các định dạng sau: JPG, JPEG, PNG & GIF";
    $uploadOk = 0;
}
// Kiểm tra điều kiện trước khi upload?
if ($uploadOk == 0) {
    echo "Upload thất bại.";
// Nếu ok thì cho phép upload file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo " File ".$target_dir. basename( $_FILES["fileToUpload"]["name"]). " upload thành công.";
        echo '<br/><img src="'.$target_dir. basename( $_FILES["fileToUpload"]["name"]).'" width="160" />';
    } else {
        echo "Upload file thất bại, vui lòng thử lại.";
    }
}
}
?>

Một số giải thích:

  • $target_dir = “uploads/” – thư mục chứa file tải lên. Nằm cùng cấp với upload2.php
  • $target_file đường dẫn tập tin được tải lên
  • $uploadOk=1 để kiểm tra dữ liệu trước khi upload
  • $imageFileType kiểm tra phần mở rộng của tập tin
  • Tiếp theo kiểm tra xem ảnh có thật hay bị giả mạo (vd: social.php => social.png)

Chúc các bạn thành công.

CRUD using Ajax in ASP.NET MVC

Trong quá trình học và làm lập trình, bạn thường nghe nói nhiều đến Ajax, được khuyên dùng Ajax trong nhiều câu trả lời. Vậy ajax là gì? Ứng dụng ajax vào có khó hay không? Trong video dưới đây mình sẽ hướng dẫn các bạn cách thêm, xóa, sửa, lấy dữ liệu bằng Ajax trong ASP.NET MVC (Các bạn hoàn toàn có thể ứng dụng vào cho ngôn ngữ lập trình khác như PHP chằng hạn…)

Video Demo CRUD using Ajax in ASP.NET MVC

Tóm tắt Video

  • Ajax là gì?
  • Tạo Cơ sở dữ liệu bảng Student (lưu thông tin sinh viên)
  • Tạo dự án ASP.NET MVC mới
  • Tạo class xử lý thêm, xóa sửa
  • Tạo form thêm sinh viên
  • Viết code cho Controller
  • Viết code cho file javascript

Bạn hoàn toàn có thể ứng dụng Ajax trong nhiều trường hợp: đăng nhập, đăng ký, tìm kiếm thông tin, giỏ hàng….
Nếu bạn đã hoàn thành theo hướng dẫn mà vẫn gặp khó khăn, hãy tải mã nguồn ứng dụng tại đây:  Download

Cảm ơn bạn đọc và mình luôn đánh giá cao phản hồi của bạn.

Multiple file upload in ASP.NET MVC

Khi lập trình web với ASP.NET MVC hay bất kỳ ngôn ngữ nào khác như PHP chẳng hạn, chúng ta đều gặp những tình huống liên quan đến Upload file lên hosting, dễ thấy nhất là upload hình sản phẩm cho một sản phẩm nào đó.

Với ASP.NET MVC chúng ta dễ dàng làm được điều đó, bạn có thể upload 1 file hoặc upload nhiều file (Multiple file upload) trong ASP.NET MVC cùng lúc. Nó cực kỳ hữu ích trong nhiều trường hợp. Đoạn code nhỏ sau đây sẽ minh họa cho vấn đề này.

Multiple file upload in ASP.NET MVC
Multiple file upload in ASP.NET MVC

Code HTML

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Upload file trong ASP.NET MVC</title>
    <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            var max_fields = 10; //maximum input boxes allowed
            var wrapper = $(".myinput"); //Fields wrapper
            var add_button = $(".btnAddNew"); //Add button ID

            var x = 0; //initlal text box count
            $(add_button).click(function (e) { //on add input button click
                e.preventDefault();
                if (x < max_fields) { //max input box allowed
                    x++; //text box increment
                    $(wrapper).append('<div>   <input type="file" name="uploadFile['+x+']" /><a href="#" class="btnRemove">Xóa</a></div>'); //add input box
                }
            });

            $(wrapper).on("click", ".btnRemove", function (e) { //user click on remove text
                e.preventDefault(); $(this).parent('div').remove(); x--;
            })
        });
    </script>
</head>
<body>
    <div>
        <h2>Upload file trong ASP.NET MVC</h2>
        <div style="color:red">
            @Html.Raw(TempData["Msg"])
        </div>
        <fieldset>
            <legend>Upload file</legend>
            @using (Html.BeginForm("Upload", "Upload", FormMethod.Post, new { enctype = "multipart/form-data" }))
            {

                <label>Chọn file: </label>
                <br />
                <input type="file" name="uploadFile" required /><br />

                <input type="submit" value="Upload" />

            }
        </fieldset>
        <hr />
        <h3>Upload nhiều file trong ASP.NET MVC</h3>
        <fieldset>
            <legend>Upload multi file</legend>
            @using (Html.BeginForm("UploadMulti", "Upload", FormMethod.Post, new { enctype = "multipart/form-data" }))
            {

                <label>Chọn file: </label><br />
                <a class="btnAddNew" href="#">Thêm</a>
                <br />
                <div id="myinput" class="myinput">
                    <input type="file" name="uploadFile[0]" required /><br />
                </div>
                <br />
                <input type="submit" value="Upload" />

            }
        </fieldset>

Code cs

/**   FileName: UploadController.cs 
          Project Name: DateTime Ajax
          Date Created: 12/17/2014 11:30:58 PM 
          Description:  File Upload trong ASP.NET MVC
          Version: 0.0.0.0 
          Author: Lê Thanh Tuấn - Khoa CNTT
          Author Email: [email protected] 
          Author Mobile: 0976060432
          Author URI: https://tuanitpro.com 
          License: 
     */

    public class UploadController : Controller
    {
        // GET: Upload
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Upload(HttpPostedFileBase uploadFile)
        {
            if (ModelState.IsValid)
            {
                string filePath = Path.Combine(HttpContext.Server.MapPath("/Uploads/demo"),
                                               Path.GetFileName(uploadFile.FileName));
                uploadFile.SaveAs(filePath);
                TempData["Msg"] = string.Format("Upload file {0} thành công", uploadFile.FileName);
            }
            return RedirectToAction("Index");
        }

        [HttpPost]
        public ActionResult UploadMulti(List<HttpPostedFileBase> uploadFile)
        {
            string abc = "";
            string def = "";
            foreach (var item in uploadFile)
            {

                string filePath = Path.Combine(HttpContext.Server.MapPath("/Uploads/demo"),
                                               Path.GetFileName(item.FileName));
                item.SaveAs(filePath);

                abc = string.Format("Upload {0} file thành công", uploadFile.Count);

                def += item.FileName + "; ";


            }
            TempData["Msg"] = abc + "</br>" + def;
            return RedirectToAction("Index");
        }
    }

Live demo

Chúc các bạn thành công.

Vừa gà vừa chó, bó lại cho tròn, ba mươi sáu con, một trăm chân chẵn. Hỏi mấy gà, mấy chó?

Có một bài toán dân gian khá thú vị như sau:

Vừa gà vừa chó
Bó lại cho tròn
Ba mươi sáu(36) con
Một trăm(100) chân chẵn
Hỏi mấy gà, mấy chó?

Đây là bài toán vui, từ khi học tiểu học mình đã biết, lên trung học, học giải phương trình cũng gặp lại nó. Và bây giờ, làm lập trình, tự dưng nhớ tới nó, nên viết ra đây, coi như chia sẻ cho các bạn mới học lập trình có thêm hào hứng, giải quyết các bài tập nho nhỏ, vui vẻ tương tự.

Cách giải nó như sau:

Gọi x là số gà
Số chó là: 36 – x
Số chân gà: 2x
Số chân chó: 4(36-x)
theo đề bài ta có:
2x + 4(36 – x) =100
2x + 144 – 4x = 100
2x = 144 – 100
2x = 44
x = 22
Vậy số gà là 22 con
Số chó : 36 – 22 = 14

Bạn bảo mấy con chó đặt 2 chân trước lên ghế,tổng số chân dưới đất sẽ là 36 x 2  = 72 chân. Suy ra số chân trên ghế là 28 chân.
Vậy có 14 con chó ….

Dùng hệ phương trình
Gọi x là gà, y là chó
Ta có hệ pt:
x + y = 36
2x + 4y = 100
Giải hệ pt
x = 22,y = 14
Vậy gà có 22 con, chó có 14 con. Mời các bạn chia sẻ thêm cách giải hay, thú vị khác nữa nhé.

Vậy thì làm sao để giải nó bằng cách lập trình. Đây không phải vấn đề khó với nhiều bạn, tuy nhiên mình thấy vui vẻ, nên vẫn viết ra đây.

Sau đây là cách giải trong một số ngôn ngữ lập trình như Pascal, C++, C#, Java, PHP, ASP.NET, Javascript. Trường hợp máy bạn không cài sẵn IDE, bạn có thể sử dụng trang web http://ideone.com để chạy thử code.

Vì số con là 36 và số chân là 100. Giả sử tất cả là chó, thì số con tối đa là 100/4 = 25 (con). Tối thiểu là 36 / 4 = 9 (con). Như vậy chúng ta chỉ cần sử dụng vòng lặp for từ 9->25. Tối ưu hơn so với từ 0 -> 36

Pascal


program HelloWorld;
var i :Integer;
begin
   writeln('Giai bai toan dan gian bang Pascal');
writeln('Vua ga vua cho');
writeln('Bo lai cho tron');
writeln('Ba muoi sau(36) con');
writeln('Mot tram(100) chan chan');
writeln('Hoi may ga, may cho?');
for i:= 9 to 25 do
if((i * 2 + (36 - i) * 4) = 100) then
writeln('So ga la: ', i);
writeln('So cho la: ', 36 - i);
end.

C++

#include 
#include;
#include;
using namespace std;
int main(){
cout << "Gia bai toan dan gian trong C++\n";
cout << "Vua ga vua cho\n";
cout << "Bo lai cho tron\n";
cout << "Ba muoi sau(36) con\n";
cout << "Mot tram(100) chan chan\n";
cout << "Hoi may ga, may cho?\n";
cout << "\n";
for (int i = 9; i < 25; i++)
{
if ((i * 2 + (36 - i) * 4) == 100){
cout << "So ga la: " << i << "\n";
cout << "So cho la: " << (36 - i) << "\n";
                        break;
}
}
}

Java

public class Main {
public Main() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Giải bài toán dân gian trong Java");
System.out.println("Vừa gà vừa chó");
System.out.println("Bó lại cho tròn");
System.out.println("Ba mươi sáu(36) con");
System.out.println("Một trăm(100) chân chẵn");
System.out.println("Hỏi mấy gà, mấy chó?\n");
for(int i = 9; i < 25; i++){
if((i*2+(36-i)*4)==100){
System.out.println("Số gà là: " + i);
System.out.println("Số chó là: " + i);
}
}
}
}

C#

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Gia bai toan dan gian trong C#");
            Console.Write("Vua ga vua cho\n");
            Console.Write("Bo lai cho tron\n");
            Console.Write("Ba muoi sau(36) con\n");
            Console.Write("Mot tram(100) chan chan\n");
            Console.WriteLine("Hoi may ga, may cho?\n");
            for (int i = 9; i <= 25; i++)
            {
                if ((2 * i + (36 - i) * 4) == 100)
                {
                    Console.WriteLine("So ga la: " + i);
                    Console.WriteLine("So cho la: " + (36 - i));
                    break;
                }
            }
            Console.ReadKey();
        }
    }

ASP.NET

void GiaiBaiToanDanGian()
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 9; i < 25; i++)
        {
            if ((i * 2 + (36 - i) * 4) == 100)
            {
                sb.AppendLine("Số gà là: " + i);
                sb.AppendLine("Số chó là: " + (36 - i));
            }
        }
        Label1.Text = sb.ToString();
    }

PHP




Bài toán dân gian


Giải bài toán dân gian trong PHP
Vừa gà vừa chó 
Bó lại cho tròn 
Ba mươi sáu(36) con 
Một trăm(100) chân chẵn
Hỏi mấy gà, mấy chó?

'; echo 'Số chó là: '.(36 - $i); } } ?>

Javascript


alert('Giai bai toan dan gian');for(i = 9; i < 25; i++){if((i * 2 + (36-i)*4) === 100){alert('Số gà là: ' + i + '; Số chó là: '+(36-i));}}

Chúc các bạn học lập trình vui vẻ