Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

169
Views
Acelere las consultas MySQL (no almacenables)

Tengo un código de prueba de sesión de PHP, para garantizar que el usuario que inició sesión sea válido. Solo explicaré algunas de las funciones: is_logged_in solo verifica si algunas variables de sesión están configuradas y test_duplicate conecta a la base de datos para verificar si hay una fila con una columna que iguala el valor.

 function check_account(){ if(is_logged_in()){ // Destroy session if the user doesn't exist. if(test_duplicate("username", $_SESSION["user"])){ session_destroy(); } } if($_SESSION["valid_day"] != date("Ymd")){ // Destroy session if the key has expired session_destroy(); } } function test_duplicate($field, $value){ $mysqli = database_connect(); $statement = $mysqli->prepare("SELECT * FROM users WHERE " . $field . " = ?"); $statement->bind_param("s", $value); $statement->execute(); $statement->store_result(); $rows = $statement->num_rows; if($rows > 0){ return FALSE; } return TRUE; } function database_connect(){ if(!isset($dbconnection)){ $config = get_configuration(); // Create connection $mysqli = new mysqli($config["hostname"], $config["username"], $config["password"], $config["database"]); if($mysqli->connect_error){ die("<h1>Error 1 :: Critical backend failure</h1>"); } if(!check_tables($mysqli)){ die("<h1>Error 2 :: Critical backend failure</h1>"); } $dbconnection = $mysqli; return $mysqli; }else{ return $dbconnection; } }

Los problemas:

  • Esta función test_duplicate tarda entre 3 y 4 segundos en completarse
  • El almacenamiento en caché no funcionará porque necesito probar ese valor (está determinando si el usuario aún existe en la base de datos)

Mis soluciones actuales (no creo que sean particularmente buenas):

  • Solo ejecutar el código al azar (es decir, una probabilidad de 1/5)
  • No ejecutar el código (pero no estoy seguro de cómo implementar esto alternativamente)
over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Yo sugeriría:

  1. Agregue código de depuración para medir cuánto tiempo lleva cada línea de código en la función test_duplicate .
  2. Almacenar en caché la conexión y compartirla entre sus componentes como sugiere @jeroen en los comentarios.
  3. En lugar de seleccionar todos los campos con select * , devuelve un único valor entero. Mejor aún, en lugar de manejarlo como una consulta que devuelve una fila, hágalo como una consulta escalar que devuelve un valor único.

Actualizar

Aquí hay una consulta que devuelve 1 si hay una fila con un valor específico en el nombre de username ; o 0 si no existe ninguna fila coincidente:

 select ifnull( ( select 1 as user_exists from dual where exists( select * from users where username = 'test2' ) ), 0) as result from dual
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!