package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
ID int
Username string
Email string
}
func getUserByID(db *sql.DB, userID string) (*User, error) {
// SECURE: Use ? placeholder instead of concatenation
query := "SELECT id, username, email FROM users WHERE id = ?"
row := db.QueryRow(query, userID) // Pass userID as parameter
var user User
err := row.Scan(&user.ID, &user.Username, &user.Email)
return &user, err
}
func searchUsers(db *sql.DB, name, department string) ([]User, error) {
// SECURE: Use ? placeholders for all values
query := "SELECT id, username, email FROM users WHERE name LIKE ? AND department = ?"
rows, err := db.Query(query, "%"+name+"%", department) // Parameters
if err != nil {
return nil, err
}
defer rows.Close()
var users []User
for rows.Next() {
var user User
rows.Scan(&user.ID, &user.Username, &user.Email)
users = append(users, user)
}
return users, nil
}
// SECURE: Prepared statement for repeated operations
func getUsersByStatus(db *sql.DB, status string) ([]User, error) {
stmt, err := db.Prepare("SELECT id, username, email FROM users WHERE status = ?")
if err != nil {
return nil, err
}
defer stmt.Close()
rows, err := stmt.Query(status) // Pass status as parameter
if err != nil {
return nil, err
}
defer rows.Close()
var users []User
for rows.Next() {
var user User
rows.Scan(&user.ID, &user.Username, &user.Email)
users = append(users, user)
}
return users, nil
}