web-dev-qa-db-fra.com

Le nombre de colonnes de mysql.proc est incorrect. Attendu 20, trouvé 16. La table est probablement corrompue

J'utilise 000webhost.com et j'utilise phpMyAdmin. Je reçois cette erreur de mysql lorsque je lance mon script PHP comme le titre l'indique:

Le nombre de colonnes de mysql.proc est incorrect. Attendu 20, trouvé 16. 

La table est probablement corrompue.

Existe-t-il une solution à ça? Je vous remercie. 

Edité: Voici mon code 

<?php
$username="usrname";
$password="passwd";
$database="a1xxxxx_mydb";
$Host="mysqlxx.000webhost.com";
mysql_connect($Host,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
if (isset($_GET["userLatitude"]) && isset($_GET["userLongitude"])) {

 $userLatitude=$_GET['userLatitude']; 
 $userLongitude=$_GET['userLongitude']; 
 $result = mysql_query("SELECT locationName, ( 6371 * acos( cos( radians(floatval(     $userLatitude) )) * cos( radians( locationLatitude ) ) * cos( radians( locationLongitude ) - radians( floatval($userLatitude)) ) + sin( radians(floatval($userLongitude)) ) * sin( radians( locationLatitude) ) ) ) AS distance 
         FROM Location HAVING distance < 2 ORDER BY distance LIMIT 0 ,20") or die(mysql_error()); 
echo $result;

 // check for empty result
if (mysql_num_rows($result) > 0) {
   // looping through all results
   // products node
  $response["Location"] = array();

  while ($row = mysql_fetch_array($result)) {
    // temp user array
    $product = array();
    $product["locationName"] = $row["locationName"];
    $product["locationInfo"] = $row["locationInfo"];
    $product["locationLatitude"] = $row["locationLatitude"];
    $product["locationLongitude"] = $row["locationLongitude"];
    $product["locationPic"] = $row["locationPic"];
    $product["city"] = $row["city"];



    // Push single product into final response array
    array_Push($response["Location"], $product);
 }
 // success
 $response["success"] = 1;

   // echoing JSON response
   echo json_encode($response);
 } else {
// no products found
$response["success"] = 0;
$response["message"] = "No products found";

// echo no users JSON
echo json_encode($response);
 }
 }
  else {
    // required field is missing
   $response["success"] = 0;
   $response["message"] = "Required field(s) is missing";

  // echoing JSON response
  echo json_encode($response);
 }
mysql_close();
?>
14
user2086258

J'ai eu cette erreur aussi. Je l'ai corrigé en courant 

mysql_upgrade -u root -p

De plus, redémarrez le service mysql en lançant 

service mysqld restart
43
Louhbo

Cette erreur se produit lorsqu'une mauvaise mise à niveau est effectuée. Par exemple, cela se produit si vous effectuez une mise à niveau de la version 5.0 vers la version 5.1 sans exécuter le script mysql_upgrade; ou, dans de rares cas, cela se produit probablement si vous passez directement de la version 5.0 à la version 5.5. (Beaucoup de gens le font, mais ces mises à jour ne sont pas officiellement supportées.) Vous dites que vous utilisez un service d'hébergement - eh bien, je pense que vous devriez créer un ticket et leur parler du problème. Si vous ne possédez pas le privilège SUPER, vous ne pouvez rien faire. Mais si vous avez ce droit, lancez simplement mysql_upgrade: http://dev.mysql.com/ doc/refman/5.1/fr/mysql-upgrade.html

12
Federico Razzoli

J'ai eu le même problème lorsque j'ai mis à jour le serveur mysql de 5.5 à 5.7 dans Debian 8 (Jessie). Dans mon cas, cela a bien fonctionné lorsque j'ai exécuté la commande suivante:

mysql_upgrade --force -uroot -p

J'espère que cela vous aidera

1
Correcter

Bien que vous ayez peut-être raison sur la nécessité d'une mise à niveau, ce n'est pas la seule raison de cette erreur.

Quand le suivant est appelé avec une requête qui retourne 1 ligne

 my $rv = $sth_indexq->fetchall_arrayref;

l'erreur suivante est signalée: 

DBD::mysql::st execute failed: Column count of mysql.proc is wrong. Expected 20, found 16. Created with MySQL 50520, now running 50528. Please use mysql_upgrade to fix this error. at 
...

Cependant, la véritable cause de l'erreur était l'utilisation de fetchall_arrayref au lieu de fetchrow_arrayref. Les éléments suivants ont fonctionné sans erreur:

my $rv = $sth_indexq->fetchrow_arrayref;

Les données dans $ rv n'étaient que de 1 niveau en profondeur, pas 2

La solution mysql_upgrade peut très bien résoudre ce problème, mais la solution simple consiste à connaître vos données et à utiliser le code de récupération approprié. 

J.White

1
Joe White